题意: 给出你一行字符串,输出在这行字符串中既是前缀又是后缀的字串的长度、
思路:KMP中,next数组的性质、因为next数组求解的就是前后缀相同的个数、首先他自己本身一定是相同的,然后根据next数组依次向前跳跃、最后按照从小到大输出便可、
AC代码:
#include<cstdio>
#include<cstring>
const int maxn=400200;
char T[maxn];
int lent,next[maxn];
int msq[maxn],ans;
void get_next()
{
memset(next,0,sizeof(next));
int i=0;int j=-1; next[0]=-1;
while(i<lent){
if(j==-1||T[i]==T[j])
next[++i]=++j;
else
j=next[j];
}
}
int main()
{
while(scanf("%s",T)!=EOF){
lent=strlen(T);
get_next();
ans=1; msq[0]=lent;
while(next[lent]){
msq[ans++]=next[lent];
lent=next[lent];
}
for(int i=ans-1;i>0;i--)
printf("%d ",msq[i]);
printf("%d\n",msq[0]);
}
return 0;
}