#include <bits/stdc++.h>   using namespace std;   const int INF = INT_MAX;   const signed long long int LINF = LLONG_MAX;   const double EPS = 1e-9;   const int MOD = 1000000007;   const int MAXN = 100001;   const int ALPH = 26;   const int DALPH = 52;   string s;   vector<int> z;   vector<pair<int, int> > ans;   vector<int> add, sum;   int main() {     cin >> s;     z.resize((int)(s).size());     int l = 0, r = 0;     z[0] = (int)(s).size();     for (int i = 1; i < (int)(s).size(); ++i) {       int j = 0;       if (i <= r) {         int ind = i - l;         j = min(z[ind], r - i + 1);       }       for (; i + j < (int)(s).size(); ++j) {         if (s[j] != s[i + j]) {           break;         }       }       z[i] = j;       if (i + j - 1 > r) {         r = i + j - 1;         l = i;       }     }     add.resize((int)(s).size());     for (int i = 1; i < (int)(s).size(); ++i) {       add[0]++;       add[z[i]]--;     }     sum.resize((int)(s).size());     int cnt = 0;     for (int i = 0; i < (int)(s).size(); ++i) {       cnt += add[i];       sum[i] = cnt + 1;     }     for (int i = (int)(s).size() - 1; i >= 0; --i) {       if (i + z[i] != (int)(s).size()) {         continue;       }       ans.push_back(make_pair((z[i]), (sum[z[i] - 1])));     }     printf( %d n , (int)(ans).size());     for (int i = 0; i < (int)(ans).size(); ++i) {       printf( %d %d n , ans[i].first, ans[i].second);     }   }   