题目描述
题解
从后往前不断地找失配即可。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max_w=400005;
char W[max_w];
int len,T[max_w],ans[max_w],tot;
inline void calc_T(){
T[0]=-1;
int j;
for (int i=0;i<len;++i){
j=T[i];
while (j!=-1&&W[i]!=W[j])
j=T[j];
T[i+1]=++j;
}
}
inline void calc_ans(){
int j=len;
while (j!=-1){
ans[++tot]=j;
j=T[j];
}
}
int main(){
while (gets(W)){
memset(T,0,sizeof(T));
len=strlen(W);
calc_T();
memset(ans,0,sizeof(ans));
tot=0;
calc_ans();
for (int i=tot-1;i>=1;--i)
printf("%d%c",ans[i]," \n"[i==1]);
}
}