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
Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
Output
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 181 2 3 4 5
题意:
给你字符串s ,让你求所有子串即使s的前缀又是后缀的长度,从小到大输出
解;
盗图:
如左图,假设黑色线来代表字符串str,其长度是len,红色线的长度代表next[len],根据next数组定义易得前缀的next[len]长度的子串和后缀next[len]长度的子串完全相同(也就是两条线所对应的位置)。我们再求出next[len]位置处的next值,也就是图中蓝线对应的长度。同样可以得到两个蓝线对应的子串肯定完全相同,又由于第二段蓝线属于左侧红线的后缀,所以又能得到它肯定也是整个字符串的后缀。
所以对于这道题,求出len处的next值,并递归的向下求出所有的next值,得到的就是答案。
#include<iostream> #include<cstdio> #include<stack> #include<cstring> using namespace std; const int N=(int)4e5+10; int nxt[N],m; void get(char *s) { int i=0,j=-1; nxt[0]=-1; while(i<m) { if(j==-1||s[i]==s[j]) nxt[++i]=++j; else j=nxt[j]; } } char s[N]; int main() { while(cin>>s) { m=strlen(s); get(s); stack<int > q; while(!q.empty()) { q.pop();} q.push(m); int j=m; while(j) { q.push(nxt[j]); j=nxt[j]; } while(!q.empty()) { int tt=q.top(); if(tt) cout<<tt<<" "; q.pop(); } puts(""); } return 0; }