http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html
这个博客讲的非常好,
这道题我感觉就是有问题,上面博客将了,网上一般的 两种做法,
但都是错的,但在poj上都能过,他说的我没看懂,就编了个求最小公倍数的水过了1_1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char p[10040][80];
int next[10050];
int LCM(int a,int b)
{
int x=a,y=b;
int r=x%y;
while(r>0)
{
x=y;
y=r;
r=x%y;
}
return a*b/y;
}
int main()
{
int i,j,k;
int n,m,ans1=1,ans2=1;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
memset(next,0,sizeof(next));
scanf("%s",p[i]);
int a=0,b=-1;
next[0]=-1;
while(a<m){
if(p[i][a]==p[i][b] || b==-1){
a++,b++;
next[a]=b;
}
else
b=next[b];
}
ans1=LCM(ans1,m-next[m]);
}
for(i=0;i<m;i++){
memset(next,0,sizeof(next));
int a=0,b=-1;
next[0]=-1;
while(a<n){
if(p[a][i]==p[b][i] || b==-1){
a++,b++;
next[a]=b;
}
else
b=next[b];
}
ans2=LCM(ans2,n-next[n]);
}
if(ans1>m) ans1=m;
if(ans2>n) ans2=n;
printf("%d\n",ans1*ans2);
system("pause");
return 0;
}