//给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵 //可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度。 //同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了。 # include <stdio.h> # include <string.h> # include <algorithm> using namespace std; char a[10010][100]; int next[10010]; int n,m; int Getnext1(int r) { int i=0,j=-1; next[0]=-1; while(i<=m) { if(j==-1||a[r][i]==a[r][j]) i++,j++,next[i]=j; else j=next[j]; } return m-next[m]; } int Getnext2(int r) { int i=0,j=-1; next[0]=-1; while(i<=n) { if(j==-1||a[i][r]==a[j][r]) i++,j++,next[i]=j; else j=next[j]; } return n-next[n]; } int lcm(int a,int b)//最小公倍数模版 { int mul = a * b; int r = a % b; while(r) { a = b; b = r; r = a % b; } return mul / b; } int main() { int i,ans2,ans1; while(~scanf("%d%d",&n,&m)) { for(i=0; i<n; i++) scanf("%s",a[i]); ans1=1; ans2=1; for(i=0; i<n; i++) { ans1=lcm(ans1,Getnext1(i)); if(ans1>m) { ans1=m; break; } } for(i=0; i<m; i++) { ans2=lcm(ans2,Getnext2(i)); if(ans2>n) { ans2=n; break; } } printf("%d\n",ans1*ans2); } return 0; }
poj2185 Milking Grid (最小覆盖矩阵),布布扣,bubuko.com
原文地址:http://blog.csdn.net/lp_opai/article/details/38565165