一个字符串,从头到某个位置,字符串的前缀最多重复了多少次
用next数组做,对于每个位置用i - next[i]求出当前可能的循环长度,然后看能否整除即可
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define maxn 1000009
using namespace std;
int n, Next[maxn];
char s[maxn];
void pre ()
{
Next[0] = Next[1] = 0;
rep (i, 1, n - 1)
{
int j = Next[i];
while (j && s[j] != s[i])
j = Next[j];
Next[i + 1] = s[i] == s[j] ? j + 1 : 0;
}
}
int main ()
{
int ff = 0;
while (cin >> n && n)
{
printf ("Test case #%d\n", ++ff);
scanf ("%s", s);
pre ();
rep (i, 0, n - 1)
{
int len = i + 1 - Next[i + 1];
if (len != i + 1 && (i + 1) % len == 0)
printf ("%d %d\n", i + 1, (i + 1) / len);
}
cout << endl;
}
return 0;
}