http://poj.org/problem?id=1961
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int len,t;
char s[1000005];
int next[1000005];
int main(){
while(1){
scanf("%d",&len);
if(len == 0)break;
scanf("%s",s);
printf("Test case #%d\n",++t);
int i = 0,j = -1;
next[0] = -1;
while(i != len){
if(j == -1 || s[i] == s[j]){
next[++i] = ++j;
if(i % (i - next[i]) == 0){
int k = i / (i - next[i]);
if(k>1)printf("%d %d\n",i,k);
}
}
else j = next[j];
}
printf("\n");
}
return 0;
}