POJ2406的加强版,2406 是求一个字符串中循环节次数,而这道题是输出所有前 i 个字符构成的字符串的循环节次数,所以在求 next 数组中,每求出一次就判断一次是否有循环节,如果有就输出。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
using namespace std;
char a[1000005];
int nextt[1000005], l;
void kmp_pre(char x[],int m,int nextt[]){
int i, j;
j = nextt[0] = -1;
i = 0;
while(i < m){
while(-1!=j && x[i]!=x[j])
j = nextt[j];
nextt[++i] = ++j;
if(nextt[i]!=0 && i%(i-nextt[i]) == 0){
int ans = i/(i-nextt[i]);
cout << i << " " << ans << endl;
}
}
}
int main(){
//freopen("a.txt", "r", stdin);
int n, cas = 1;
while(~scanf("%d", &n) && n){
scanf("%s", a);
printf("Test case #%d\n", cas++);
kmp_pre(a, n, nextt);
cout << endl;
}
return 0;
}