141. 周期
当
i
−
n
e
x
t
[
i
]
能
整
除
i
时
,
S
[
1
—
—
i
−
n
e
x
t
[
i
]
]
就
是
S
[
1
—
—
i
]
的
最
小
循
环
元
,
它
的
最
大
循
环
次
数
就
是
i
/
(
i
−
n
e
x
t
[
i
]
)
当i-next[i]能整除i时,S[1——i-next[i]]就是S[1——i]的最小循环元,它的最大循环次数就是i/(i-next[i])
当i−next[i]能整除i时,S[1——i−next[i]]就是S[1——i]的最小循环元,它的最大循环次数就是i/(i−next[i])
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
int Next[N + 5];
char s2[N + 5];
int len1, len2;
void get_next()
{
int i, j;
i = 0;
Next[0] = j = -1;
while(i < len2) {
if(j == -1 || s2[i] == s2[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main(void)
{
int n, id = 1;;
while (cin >> n && n != 0){
scanf("%s", s2);
len2 = n;
get_next();
cout << "Test case #" << id++ << endl;
for (int i = 2; i <= n; i++){
if (i % (i - Next[i]) == 0 && i / (i - Next[i]) > 1){
cout << i << " " << i / (i - Next[i]) << endl;
}
}
cout << endl;
}
return 0;
}