KMP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 100010
#define INF (int)(1e9)
#define MOD ((int)1e9+7)
#define maxnode 400010
#define sigma_size 30
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main() {
char s[maxn];
int p[maxn], f[maxn], a[maxn];
while (scanf("%s", s) != EOF) {
memset(p, 0, sizeof(p));
memset(f, 0, sizeof(f));
memset(a, 0, sizeof(a));
p[0] = p[1] = 0;
int n = strlen(s);
for (int i = 1; i < n; ++ i) {
int j = p[i];
while (j && s[i] != s[j]) j = p[j];
p[i+1] = (s[i] == s[j]) ? j+1 : 0;
}
int j = n, cnt = 0;
while (j) {
cnt ++;
f[j] ++;
j = p[j];
}
for (int i = n; i >= 1; -- i) a[p[i]] ++;
for (int i = n; i >= 1; -- i) a[p[i]] += a[i];
cout << cnt << endl;
for (int i = 1; i <= n; ++ i) {
if (f[i]) {
cout << i << " " << a[i] + 1 << endl;
}
}
}
}