KMP前缀数组的理解与应用(一)
poj2752,
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define N 400100
char s[N];
int a[N],next[N];
void Creat_next()
{
int len=strlen(s);
int j=0;
for(int i=1;i<len;i++)
{
while(j>0&&s[i]!=s[j])
j=next[j-1];
if(s[i]==s[j])
j++;
next[i]=j;
}
}
int main()
{
while(~scanf("%s",s))
{
Creat_next();
int k=0;
int i=strlen(s)-1;
while(next[i]>0)
{
a[k]=next[i];
k++;
i=next[i-1];
}
for(i=k-1;i>=0;i--)
printf("%d ",a[i]);
printf("%d\n",strlen(s));
}
return 0;
}