Period
题意:
给你一个字符串,求这个字符串到第i个字符为止的循环节的次数。
比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.
例子:
字符串为aabaabaabaab
前2位也就是aa是a反复2次
前6位也就是aabaab是aab反复2次
前9位也就是aabaabaab是aab反复3次
前12位也就是aabaabaabaab是aab反复4次
解题思路:经由过程KMP的get_next.获得next[]的值。从2开端遍历每个next[i]值,然后用 i-next[j]即获得了反复字串的长度。。。。则i/(i-next[j])即为最大的个数。但同时必须是能整除的。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; char s[1000010]; int next[1000010]; int len; int get_next() { next[0]=-1; int i=0,j=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++;j++; // if(s[i]==s[j]) //next[i]=next[j]; // else next[i]=j; } else j=next[j]; } } int main () { int n,Case=0; while(~scanf("%d",&n),n) { if(Case!=0) printf("\n"); scanf("%s",s); len=strlen(s); get_next(); printf("Test case #%d\n",++Case); for(int i=1;i<=len;i++) { // printf("%d %d\n",i,next[i]); int t=i/(i-next[i]); if(i%(i-next[i])==0&&t>1) printf("%d %d\n",i,t); } } return 0; }