kmp算法的应用。
kmp算法入门http://billhoo.blog.51cto.com/2337751/411486
字符串偏移量为i-next[i],i为字符串的当前前缀长度。若偏移量能够被前缀长度整除,则该前缀可写为A^B。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void getNext(char *str,int *next)
{
int len = strlen(str);
int j = 0;
next[1] = 0;
for(int i = 2;i<len+1;i++)
{
while(j>0&&str[j]!=str[i-1])
{
j = next[j];
}
if(str[j]==str[i-1])
j++;
next[i] = j;
}
}
char str[1000005];
int next[1000005];
int main()
{
int n,k=1;
while(scanf("%d",&n)&&n)
{
scanf("%s",str);
getNext(str,next);
printf("Test case #%d\n",k++);
for(int i = 1;i<=n;i++)
{
int tmp = i-next[i];
if(tmp&&i%tmp==0)
{
if(i/tmp>1)
printf("%d %d\n",i,i/tmp);
}
}
printf("\n");
}
return 0;
}