poj 2752 kmp的next数组
题目大意:
求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标;
基本思路:
从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一直找到0;
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 400000+10; char T[maxn]; int _next[maxn]; int ans[maxn]; int getNext(){ int len=strlen(T); int j=0,k=-1; _next[0]=-1; while(j<len){ if(k==-1||T[j]==T[k]){ _next[++j]=++k; }else{ k=_next[k]; } } return len; } int main(){ while(scanf("%s",T)!=EOF){ int len=getNext(); int cnt=0; ans[cnt]=len; int tmp=len; while(ans[cnt]!=0){ tmp=_next[tmp]; ++cnt; ans[cnt]=tmp; } for(int i=cnt-1;i>=0;i--){ if(i==cnt-1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } return 0; }