首页 > 代码库 > poj 2185 Milking Grid
poj 2185 Milking Grid
题目:
链接:点击打开链接
题意:
求最小覆盖矩阵的面积。
算法:
二维的KMP算法。
思路:
最小覆盖字符串定是串的前缀,我们可以求出没一行的最小覆盖串的长度,然后求每行串的最小公倍数,就可以得到最小覆盖矩阵的长度。同理求的矩阵的宽度,便可得面积。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[10010][80]; int next[10010]; int r,c; int gcd(int a,int b) { return b == 0 ? a:gcd(b,a%b); } int lcm(int a,int b) { return a/gcd(a,b)*b; } void get_nextrow(int p)//行串的next数组 { int i,j; i = -1; j = 0; next[0] = -1; while(j<c) { if(i == -1 || s[p][i] == s[p][j]) { j++; i++; next[j] = i; } else i = next[i]; } } void get_nextcol(int p)//列串的next数组 { int i,j; i = -1; j = 0; next[0] = -1; while(j<r) { if(i == -1 || s[i][p] == s[j][p]) { j++; i++; next[j] = i; } else i = next[i]; } } int main() { //freopen("input.txt","r",stdin); int lcm_r,lcm_c; lcm_r = lcm_c = 1; cin>>r>>c; getchar(); for(int i=0; i<r; i++) gets(s[i]); for(int i=0; i<r; i++) { get_nextrow(i); lcm_r = lcm(lcm_r,c-next[c]); if(lcm_r >= c) { lcm_r = c; break; } } for(int i=0; i<c; i++) { get_nextcol(i); lcm_c = lcm(lcm_c,r-next[r]); if(lcm_c >= r) { lcm_c = r; break; } } //cout<<lcm_c<<" "<<lcm_r<<endl; cout<<lcm_c*lcm_r<<endl; return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。