Period(poj 1961)
Posted Cola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于Period(poj 1961)的主要内容,如果未能解决你的问题,请参考以下文章