传送门 http://poj.org/problem?id=2752
题目大意:求既是前缀又是后缀的前缀的可能的长度。。
同样是KMP,和 HDU 2594 Simpsons’ Hidden Talents ( http://blog.csdn.net/murmured/article/details/12867995) 一样,只不过这题是全部输出而已。
故利用失配函数性质,一路next(好吧我的代码是f),最后倒序输出
#include<cstdio>
#include<cstring>
const int MAXN=400000+10;
char P[MAXN];
int f[MAXN];
int n,m;
int ans[MAXN];
void getFail()
{
int i,j;
f[0]=f[1]=0;
for(i=1;i<n;i++)
{
j=f[i];
while(j && P[i]!=P[j])
j=f[j];
if(P[i]==P[j])
j++;
f[i+1]=j;
}
}
int main()
{
while(scanf("%s",P)!=EOF)
{
n=strlen(P);
getFail();
int len=0;
int j=n;
do
{
ans[len++]=j;
j=f[j];
}while(j);
for(int i=len-1;i>=1;i--)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[0]);
}
}