#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#define N 400005
using namespace std;
int next1[N], b[N];
char a[N];
void getnext(int h)
{
int j=0, k=-1;
next1[0]=-1;
while(j<h)
{
if(k==-1||a[j]==a[k])
{
k++;
j++;
next1[j]=k; //修改部分,这样可以求出字符串中每个元素前缀和后缀相同的最大长度
}
else k=next1[k];
}
return ;
}
int main()
{
while(scanf("%s", a)!=EOF)
{
int t, g=1, i, j=strlen(a);
getnext(j);
b[0]=j;
while(next1[j]>0)
{
j=next1[j]; //因为题目所说的都是指从最后'\0'开始的各个有可能的答案
b[g++]=j;
}
for(t=g-1; t>0; --t)
{
printf("%d ", b[t]);
}
printf("%d\n", b[t]);
}
return 0;
}
POJ 2752
最新推荐文章于 2020-08-24 20:09:30 发布