把一道好题记录起来
一开始以为是扩展KMP,然后套模板写完交上去T了
看了题解发现是KMPnext数组的应用
题解orz
我们观察next数组并经过一番推导可以得到一个结论:
凡是next[i]!=-1的,都是模式串的前缀和后缀相同的字符数
AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 4e5 + 10;
char s[N];
int ne[N],ans[N];
int l;
void getnext(){
int j = 0,k = -1;
ne[j] = k;
while(j < l){
if(k == -1 || s[j] == s[k]) ne[++ j] = ++ k;
else k = ne[k];
}
}
int main(){
while(~scanf("%s",s)){
int cnt = 0;
l = strlen(s);
getnext();
for(int i = l;ne[i] != -1;i = ne[i]){
ans[cnt ++] = i;
}
for(int i = cnt - 1;i >= 0;i --) printf("%d ",ans[i]);
printf("\n");
}
return 0;
}