Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 24711 | Accepted: 12882 |
Description
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 18 1 2 3 4 5
Source
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=4*1e5+10; 5 int next[N],ans[N]; 6 char str[N]; 7 int cnt,len; 8 void getnext(){ 9 next[0]=-1; 10 int i=0,j=-1; 11 while(i<len){ 12 if(j==-1||str[i]==str[j]){ 13 ++i;++j;next[i]=j; 14 } 15 else j=next[j]; 16 } 17 } 18 int main(){ 19 while(~scanf("%s",str)){ 20 len=strlen(str); 21 getnext(); 22 cnt=0; 23 int t=next[len-1]; 24 while(t!=-1){ 25 if(str[t]==str[len-1])ans[cnt++]=t+1; 26 t=next[t]; 27 } 28 for(int i=cnt-1;i>=0;--i) 29 printf("%d ",ans[i]); 30 printf("%d\n",len); 31 } 32 return 0; 33 }