解题思路:
这个题其实用的是next[]数组的性质来求周期、假设前K个元素匹配成功,则有str[1]=str[i-next[i] ],str[2]=str[i-next[i]+1]······str[i]=str[next[i]]。那么我们知道从str[0]到str[next[i]]是字符串的一个循环周期,即i-next[i]为重复的长度,那么长度为K的字符串中的循环次数为i/(i-next[i])。想通这点,这个题就没什么难度了·····
#include<stdio.h>
#include<string.h>
char str[1000100];
int n,len,next[10001000];
void get_next()
{
int i=1,j=0;
next[0]=-1;
while(i<n)
{
if(j==-1||str[i]==str[j])
{
i++;j++;next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int i,count=1;
while(~scanf("%d",&n),n)
{
scanf("%s",str);
get_next();
printf("Test case #%d\n",count++);
for(i=1;i<=n;i++)
{
int temp=i-next[i];
if(i%temp==0&&i/temp>1)
{
printf("%d %d",i,i/temp);
printf("\n");
}
}
printf("\n");
}
return 0;
}