点击打开链接
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 4*1e5;
char T[maxn];
int m;
int d[maxn];
void getNext(int next[])
{
int i=0, j=next[0]=-1; //i为后缀,j为前缀
while(i<m)
{
if (j==-1||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else j=next[j];
}
}
int main()
{
while(scanf("%s",T)!=EOF)
{
int next[maxn];
m=strlen(T);
getNext(next); //得到next数组
int k=0;
for(int i=m;next[i]!=-1;i=next[i])
d[k++]=i;
printf("%d",d[k-1]);
for(int i=k-2;i>=0;i--)
printf(" %d",d[i]);
printf("\n");
}
}
poj 2752
最新推荐文章于 2019-08-13 12:18:36 发布
