POJ 2185 Milking Grid (KMP,GCD)
http://poj.org/problem?id=2185
求最小覆盖子矩阵的面积,求出每行的最小覆盖子串,求最小公倍数,就是矩阵的长度
求出每列的最小覆盖子矩阵然后求最小公倍数,就是矩阵的宽
最小覆盖字串的长度 ans=len-next[len]; http://blog.csdn.net/fjsd155/article/details/6866991
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define nMAX 10005
#define mMAX 78
using namespace std;
char s[nMAX][mMAX];
int next[nMAX],r,c;
int get_next1(int x)
{
int i,j;
next[0]=-1;
i=0,j=-1;
while(i<c)
{
if(j==-1||s[x][i]==s[x][j])
{
i++,j++;
next[i]=j;
}
else j=next[j];
}
return c-next[c];
}
int get_next2(int y)
{
int i,j;
next[0]=-1;
i=0,j=-1;
while(i<r)
{
if(j==-1||s[i][y]==s[j][y])
{
i++,j++;
next[i]=j;
}
else j=next[j];
}
return r-next[r];
}
int gcd(int a,int b)
{
int t;
while(b!=0){t=a;a=b;b=t%b;}
return a;
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int main()
{
int k,i;
while(~scanf("%d%d",&r,&c))
{
getchar();
for(k=0;k<r;k++)
scanf("%s",s[k]);
int a,b,la,lb;
a=get_next1(0);
for(i=1;i<r;i++)
{
b=get_next1(i);
a=lcm(a,b);
}
la=a;
a=get_next2(0);
for(i=1;i<c;i++)
{
b=get_next2(i);
a=lcm(a,b);
}
lb=a;
if(la>c)la=c;
if(lb>r)lb=r;
printf("%d\n",la*lb);
}
return 0;
}

浙公网安备 33010602011771号