@lychee123
2017-07-12T01:38:52.000000Z
字数 807
阅读 1412
数据结构
给你一个长度为 n 的字符串 s,判断这个字符串的周期串长度(大于1的周期串),并输出之间存在多少个周期
(2 ≤ N ≤ 1000000)
Sample Input
3 //字符串长度
aaa //这个串
12
aabaabaabaab
0Sample Output
Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
对字符串进行next数组的处理
字符串下标从0开始
循环字符串 当 (i+1)%(i-next[i])==0时表示从0到i位置是一个周期串
周期串个数 num=(i+1)/(i-Next[i]);
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=1e6+6;int Next[maxn];void getnext(char s[])//next数组的处理{int l=strlen(s);Next[0]=-1;int j=-1;for(int i=1;i<l;i++){while(j>=0&&s[j+1]!=s[i])j=Next[j];if(s[j+1]==s[i])j++;Next[i]=j;}}char s[maxn];int main(){int n,i,num,t=0;while(scanf("%d",&n)&&n!=0){memset(Next,0,sizeof(Next));scanf("%s",s);getnext(s);printf("Test case #%d\n",++t);for(i=1;i<n;i++){if((i+1)%(i-Next[i])==0&&Next[i]!=-1){num=(i+1)/(i-Next[i]);printf("%d %d\n",i+1,num);}}puts("");}return 0;}
