POJ 2752 Seek the Name, Seek the Fame (KMP的next函数,求前缀和后缀的匹配长度)
给一个字符串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("\n"); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步