- 对于一个串, 假定在i处形成循环, 那么 next[i]应该是上一个循环节尾,所以i % (i - next[i]) == 0且next[i] > 0当前i - next[i]是最小循环节的长度.
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <set>
#include <map>
using namespace std;
const int N = 1000010;
char S[N];
int n, Next[N];
void getNext(){
Next[0] = -1, Next[1] = 0;
int i = 1, j = 0;
while(i < n){
if(j == -1 || S[i] == S[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main(){
int cas = 1;
while(cin >> n, n){
cin >> S;
getNext();
cout << "Test case #" << cas++ << endl;
for(int i = 2; S[i - 1]; ++i){
int t = i - Next[i];
if(i % t == 0 && Next[i]) cout << i << " " << i / t << endl;
}
cout << endl;
}
return 0;
}