周期(求串每个前缀的循环节

# 题意
给定一个字符串,求出这个字符串每个前缀的最短循环节在每个前缀中出现的次数

# 题解

求出整个串的next数组,对于每个前缀,i-next[i]就是前缀的循环节的最小长度,

如果i能整除,则前缀i用循环节完整循环构成,求出次数即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+10;
 4 int tt;
 5 int n;
 6 char s[N];
 7 int main(){
 8    while(scanf("%d%s",&n,s+1)&&n){
 9       printf("Test case #%d\n",++tt);
10       int ne[N];
11       memset(ne,0,sizeof ne);
12       for(int i = 2,j=0; i <= n; i++){
13          while(j && s[i] != s[j+1])
14             j = ne[j];
15          if(s[i] == s[j+1])
16             j++;
17          ne[i] = j;
18       }
19       for(int i=2;i<=n;i++){
20          if( i % (i - ne[i]) == 0 && i / (i - ne[i]) > 1)
21             printf("%d %d\n",i,i/(i-ne[i]));
22       }
23       puts("");
24    }
25 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12521546.html