直接用next数组往前找。next数组的含义是前缀有next[i]个字符等于后缀的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char name[400010];
int nex[400010];
void getnext()
{
memset(nex,0,sizeof(nex));
nex[0]=-1;
int j=-1,k=0;
int len=strlen(name);
while(k<len)
{
if(j==-1||name[j]==name[k])
{
j++;k++;
nex[k]=j;
}
else
j=nex[j];
}
}
int l=1;
void dfs(int x)
{
if(nex[x]==-1){
return;
}
dfs(nex[x]);
if(x==l)
printf("%d\n",x);
else printf("%d ",x);
}
int main()
{
while(scanf("%s",name)!=EOF)
{
getnext();
l=strlen(name);
dfs(l);
}
return 0;
}