题目链接:http://poj.org/problem?id=1961
参考:http://blog.csdn.net/u010489766/article/details/9272489
//算法:KMP
#include<stdio.h>
#include<string.h>
int n,next[1100000];
char str[1100000];
void get_next() //第二种next
{
int i = 0, j = -1;
next[0] = -1;
while(i <= n)
{
if(j == -1 || str[j] == str[i])
{
i++;j++;
next[i] = j;
}
else
j = next[j];
}
}
int main()
{
int cnt = 1;
while(scanf("%d",&n) != EOF && n != 0)
{
memset(str,0,sizeof(str));
memset(next,0,sizeof(next));
scanf("%s",str);
get_next();
printf("Test case #%d\n",cnt++);
for(int i = 1 ; i <= n; ++i) //因为第1个点str[0]不算,所以说i从1开始
{
int len = i - next[i];
if((i) % len == 0 && next[i] != 0) //后一个条件也不能少,因为next[i] == 0的话子字符串无法分块了
printf("%d %d\n",i,(i)/len);
}
printf("\n");
}
return 0;
}