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; }