题目链接:http://poj.org/problem?id=2752
参考:http://blog.csdn.net/u010489766/article/details/9272489
//算法:找一下规律,可以发现发现ababcababababcabab这个用例的话,next[18] = 9,next[9] = 4,next[4] =2,next[2] = -1,中间关系可以证明
#include<stdio.h>
#include<string.h>
#define INF 401000
int next[INF],len;
char s[INF];
void getnext() //第二种next的版本,这种版本只有next[0]=-1,其他的要么为0,要么大于0;next[i]表示不包括s[i]的相同的字符串的长度
{
int i = 0,j = -1;
next[0] = -1;
while(i <= len) //注意有len的情况,也就是说s[len]虽然不存在,但是有next[len]
{
if(j == -1 ||s[j] == s[i])
{
i++;j++;
next[i] = j;
}
else
j = next[j];
}
}
void output(int n)
{
if(next[n] != 0)
{
output(next[n]);
printf("%d ",next[n]);
}
}
int main()
{
memset(s,0,sizeof(s));
while(scanf("%s",s) != EOF)
{
len = strlen(s);
getnext();
output(len);
printf("%d\n",len);
memset(s,0,sizeof(s));
}
return 0;
}