Period(poj 1961)
题目大意:
给你一个字符串,求这个字符串到第i个字符为止的循环节的次数。
比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.
KMP!!!
#include<cstdio> #include<iostream> #include<cstring> #define M 1000010 using namespace std; int fail[M],a[M],m; char ch[M]; void kmp_init() { fail[1]=0; for(int i=2;i<=m;i++) { int p=fail[i-1]; while(p&&a[p+1]!=a[i])p=fail[p]; if(a[p+1]==a[i])fail[i]=p+1; else fail[i]=0; } } int main() { int cnt=0; while(1) { memset(fail,0,sizeof(fail)); scanf("%d",&m); if(m==0)break; cin>>ch; printf("Test case #%d\n",++cnt); for(int i=1;i<=m;i++) a[i]=ch[i-1]; kmp_init(); for(int i=2;i<=m;i++) { int x=i-fail[i]; if(i%x==0&&x!=i) printf("%d %d\n",i,i/x); } printf("\n"); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步