1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #define MAXN 400005
5 using namespace std;
6
7 char _m[MAXN];
8 int next[MAXN];
9 void give_next(int len);
10 int ans_len[MAXN];
11 int ans_len_index;
12 int ans[MAXN];
13 bool take_judge(int b,int len);
14 int main()
15 {
16 //freopen("acm.acm","r",stdin);
17 string s;
18 int i;
19 int j;
20 int len;
21 int index;
22 int cur;
23 //int ans;
24 while(getline(cin,s))
25 {
26 if(s.length() == 0)
27 {
28 break;
29 }
30 index = 0;
31 //cout<<s<<endl;
32 //ans = 0;
33 //cout<<s<<endl;
34 for(i = 0; i < s.length(); ++ i)
35 {
36 _m[i] = s[i];
37 }
38 memset(next,-1,sizeof(next));
39 give_next(s.length());
40
41 i = s.length();
42 //cout<<i<<" ";
43 ans[index ++] = i;
44 for(; next[i] != 0; i = next[i])
45 {
46 //cout<<next[i]<<" ";
47 ans[index++] = next[i];
48 }
49 for(i = index-1; i >= 1; -- i)
50 {
51 cout<<ans[i]<<" ";
52 }
53 cout<<ans[i]<<endl;
54 //cout<<endl;
55 // cout<<endl;
56 }
57 return 0;
58 }
59
60 bool take_judge(int b,int len)
61 {
62 int j = 0;
63 int i;
64 for(i = b; i < len; ++ i,++ j)
65 {
66 if(_m[i] != _m[j])
67 {
68 break;
69 }
70 }
71 if(i == len)
72 {
73 return true;
74 }
75 return false;
76 }
77
78 void give_next(int len) //此为求next 数组的方法。
79 {
80 int i;
81 int j;
82 i = 0;
83 j = -1;
84 next[0] = -1;
85 while(i < len)
86 {
87 if(j == -1 || _m[i] == _m[j])
88 {
89 i ++;
90 j ++;
91 next[i] = j;
92 }
93 else
94 j = next[j];
95 }
96 }