知识点:KMP算法
这个题是关于循环元的,字符串的长度除以循环元的长度就是循环次数,相应的还有最小循环元,最大循环次数的概念,本题是要求一个字符串的所有的前缀的不是本身的最小循环元的最大循环次数,如果哪个前缀除了本身就没有循环元的话,这个前缀相应的就不用输出,本题还是采用了KMP算法自身匹配的信息,并且配上一个结论的证明,程序相对来说很好写,
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int main() {
int n;
int T = 1;
while (cin >> n && n) {
cout << "Test case #" << T++ << endl;
string s;
cin >> s;
s = " " + s;
int kmp[N];
kmp[1] = 0;
for (int i = 2, j = 0; i <= n; i++) {
while (j && s[i] != s[j + 1]) j = kmp[j];
if (s[i] == s[j + 1]) j++;
kmp[i] = j;
if (i % (i - kmp[i]) == 0 && kmp[i]) {
cout << i << " " << i / (i - kmp[i]) << endl;
}
}
cout << endl;
}
return 0;
}