题目:
http://poj.org/problem?id=2752
用KMP每次求得的next值就是当前到i为止的前子串与后字串相等的子串的长度,这也正是KMP的精髓所在,呵呵,通过这道题目才理解到的..!
#include<cstdio>
#include<cstdlib>
#include<cstring>
char s[400001];
int next[400001];
int ans[400001];
void solve(char *s,int ls)
{
int i=0,j=-1;
next[0]=-1;
while(i<ls)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
int i=0;
ans[0]=strlen(s);
solve(s,ans[0]);
while(ans[i++])
{
ans[i]=next[ans[i-1]]; //从长到短,递归查找前子串后子串相等的子串
}
for(int j=i-2;j>=0;j--)
printf("%d ",ans[j]);
printf("\n");
}
return 0;
}