http://poj.org/problem?id=2406
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=10000005;
int next[NM];
char str[NM];
void get_next(){
int i,j,len;
len=strlen(str);
i=0;next[0]=j=-1;
while(i<len){
if(j==-1 || str[i]==str[j]){
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int main()
{
int t,len;
while(scanf("%s",str)){
if(strcmp(str,".")==0) break;
len=strlen(str);
get_next();
t=len-next[len];
if(len%t==0) printf("%d\n",len/t);
else printf("1\n");
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=1358
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=1000005;
int next[NM];
char str[NM];
void get_next(){
int i,j,len;
len=strlen(str);
i=0;next[0]=j=-1;
while(i<len){
if(j==-1 || str[i]==str[j]){
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
int main()
{
int i,t,k,len;
k=1;
while(scanf("%d",&len) && len){
scanf("%s",str);
get_next();
printf("Test case #%d\n",k++);
for(i=2;i<=len;i++){
t=i-next[i];
if(t!=i && i%t==0){
printf("%d %d\n",i,i/t);
}
}
printf("\n");
}
return 0;
}