给一个字符串S,求出所有前缀,使得这个前缀也正好是S的后缀。升序输出所有情况前缀的长度。
KMP中的next[i]的意义就是:前面长度为i的子串的前缀和后缀的最大匹配长度。
明白了next[i],那么这道题就很容易做了
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn=400005; char str[maxn]; int next[maxn]; int n; int ans[maxn]; void getnext(char *str,int len){ next[0]=-1; int i=0,j=-1; while(i<len){ if(j==-1 || str[i]==str[j]){ i++;j++; next[i]=j; } else j=next[j]; } } int main() { while(scanf("%s",str)!=EOF){ n=strlen(str); getnext(str,n); int l=next[n]; int idx=0; ans[idx++]=n; while(l!=0){ ans[idx++]=l; l=next[l]; } for(int i=idx-1;i>=0;i--){ if(i==idx-1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf(" "); } return 0; }