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; }