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
给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀。从小到大依次输出这些子串的长度。
思路:套KMP模板
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int Max=400005; 6 char str[Max]; 7 int len,nex[Max],ans[Max]; 8 void getnex() 9 { 10 int i=0,j=-1; 11 nex[0]=-1; 12 while(i<len){ 13 if(j==-1||str[i]==str[j]){ 14 i++; 15 j++; 16 nex[i]=j; 17 } 18 else 19 j=nex[j]; 20 } 21 } 22 int main() 23 { 24 while(scanf("%s",str)!=EOF){ 25 len=strlen(str); 26 getnex(); 27 ans[0]=len; 28 int n=0,i=len; 29 while(nex[i]>0){ 30 ans[++n]=nex[i]; 31 i=nex[i]; 32 } 33 for(i=n;i>=0;i--){ 34 printf("%d ",ans[i]); 35 } 36 printf("\n"); 37 } 38 }