Description
Input
Output
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 18 1 2 3 4 5
给一个串s,使它的长度为k的前缀和后缀相同,输出所有k
还是KMP……不过有点坑……原来想倒着做结果发现不对……最后灵机一动才想出做法
先求出s的next数组,然后j=n while (j){ans[++len]=j j=next[j]}这样就行了
这个还是要会到next的定义上去。
next[i]是当前这个匹配不成功的时候可以往前跳到的最长的状态。一开始j=n,然后每次求出一个j,那么j都是n往前跳到的某一个合法状态。
#include<cstdio> #include<cstring> char s[1000010]; int next[1000010]; int l,j; int ans[1000010],len; int main() { while (~scanf("%s",s+1)) { l=strlen(s+1);j=0; memset(next,0,sizeof(next)); for (int i=2;i<=l;i++) { while (j>0 && s[j+1]!=s[i])j=next[j]; if (s[j+1]==s[i])j++; next[i]=j; } j=l;len=0; while (j!=0) { ans[++len]=j; j=next[j]; } for (int i=len;i;i--)printf("%d ",ans[i]); printf("\n"); } return 0; }
poj2752 Seek the Name, Seek the Fame
原文:http://www.cnblogs.com/zhber/p/4162941.html