题意:求前缀的循环周期。
示例:abababab
前4个字符,循环字串为ab,有2个循环周期 ab|ab
前6个字符,循环字串为ab,有3个循环周期 ab|ab|ab
前8个字符,循环字串为ab,有4个循环周期 ab|ab|ab|ab
输出:
4 2
6 3
8 4
当i=6时,next[4] = 4;
循环字串的长度 = next[i] - (2 * next[i] - i) = 2 //2*next[i]-i 为相交长度
循环字串的周期 = i / 循环字串的长度
#include <iostream>
using namespace std;
const int MAXN = 1000010;
char str[MAXN];
int next[MAXN];
int main()
{
int n;
int Case = 1;
while(cin>>n,n)
{
cin>>str;
int j = -1;
int i = 0;
next[0] = -1;
while(i < n)
{
if(j == -1 || str[i] == str[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
printf("Test case #%d\n",Case++);
for(int i=1; i<=n; i++)
{
int cross = 2*next[i] - i; //相交部分的长度
int circle = next[i] - cross; //循环长度
if(cross >= 0 && i % circle == 0)
{
printf("%d %d\n",i,i/circle);
}
}
printf("\n");
}
return 0;
}