#include <bits/stdc++.h>
using namespace std;
int z[100005];
void z_algo(string s) {
  z[0] = s.size();
  int L = 0, R = 0;
  int sz = s.size();
  for (int i = 1; i < sz; i++) {
    if (i > R) {
      L = R = i;
      while (R < sz && s[R - L] == s[R]) R++;
      z[i] = R - L;
      R--;
    } else {
      int k = i - L;
      if (z[k] < R - i + 1)
        z[i] = z[k];
      else {
        L = i;
        while (R < sz && s[R - L] == s[R]) R++;
        z[i] = R - L;
        R--;
      }
    }
  }
}
int ara[100005];
int main() {
  string st;
  cin >> st;
  z_algo(st);
  for (int i = 0; i < st.size(); i++) {
    ara[z[i]]++;
  }
  vector<int> ans;
  for (int i = st.size() - 1; i >= 0; i--) {
    if (i + z[i] == st.size()) {
      ans.push_back(z[i]);
    }
  }
  for (int i = 1; i <= st.size(); i++) {
    ara[i] += ara[i - 1];
  }
  printf("%d\n", ans.size());
  for (int i : ans) {
    int x = ara[st.size()] - ara[i - 1];
    printf("%d %d\n", i, x);
  }
}
