Step1. Connect the father's name and the mother's name, to a new string S.
Step2. Find a proper prefix-suffix string of S (which is not only the prefix, but also the suffix of S).
Example: Father='ala', Mother='la', we have S = 'ala'+'la' = 'alala'. Potential prefix-suffix strings of S are {'a', 'ala', 'alala'}. Given the string S, could you help the little cat to write a program to calculate the length of possible prefix-suffix strings of S? (He might thank you by giving your baby a name:)
Input
The input contains a number of test cases. Each test case occupies a single line that contains the string S described above.Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
Output
For each test case, output a single line with integer numbers in increasing order, denoting the possible length of the new baby's name.Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 18 1 2 3 4 5
/*题意:求既匹配字符串前缀又匹配后缀的字符 串的长度 思路:其实next[]数组就表示的是最长的前缀和后缀匹配, 那么只要next[]数组的值不为0的话, 就代表有前后缀匹配,递归下去, 当然整个字符串也符合条件*/ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 400010; char s[maxn]; int next[maxn], flag,l1; void getnext(int l) { int i=0,j=-1; next[0]=-1; while(i<l) { if(j==-1||s[i]==s[j]) { i++,j++; next[i]=j; } else j=next[j]; /*此时t[j] != t[k] , 所以就有 next[j+1] < k, 那么求 next[j+1] 就等同于求 t[j] 往前小于 k 个的字符与 t[k] 前面的字符的最长重合串, 即 t[j-k+1] ~ t[j] 与 t[0] ~ t[k-1] 的最长重合串, 那么就相当于求 next[k] }*/ } void dfs(int x) { if(x==0) return ; dfs(next[x]); if (!flag) { printf("%d",x); flag = 1; } else printf(" %d",x); } int main() { while(~scanf("%s",s)) { int l1=strlen(s); getnext(l1); flag=0; dfs(l1); printf("\n"); } }