Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 11198 | Accepted: 5457 |
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
題意:給你一個字符串,找出所有的前綴和後綴相等的子串,按小到大輸出這些子串的長度,kmp變形
深刻理解next函數的意義,這題就變得非常簡單。
代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char s[400005];
int e[400005];
int next[400005];
void getnext(char *s,int *next,int len)
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<len)
{
if(j==-1||s[j]==s[i])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int t,i,j,k,n;
while(~scanf("%s",s))
{
t=strlen(s);
memset(next,0,sizeof(next));
getnext(s,next,t);
e[0]=t;
i=t;n=1;
while(next[i]>0)
{
e[n++]=next[i];
i=next[i];
}
for(i=n-1;i>=0;i--)
{
printf("%d",e[i]);
if(i!=0)
printf(" ");
}
printf("\n");
}
return 0;
}