# 题意
给定一个字符串,求出这个字符串每个前缀的最短循环节在每个前缀中出现的次数
# 题解
求出整个串的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 }