poj2185 Milking Grid(两次KMP)

来源:互联网 发布:淘宝nike鸳鸯球鞋 编辑:程序博客网 时间:2024/05/21 21:44

题目链接:http://poj.org/problem?id=2185

题目大意:在字符矩阵中找出一个最小子矩阵,使其多次复制所得的矩阵包含原矩阵。

思路:

做两次KMP,分别为一次行一次列。
 
行和列分别是len-next[len];
 
最后两个结果相乘就可以了
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;char str[10010][100];int r,c;const int maxn=10010;int nexts[maxn];bool same1(int i,int j)//判断第i行和第j行是否相等{for(int k=0;k<c;k++)if(str[i][k]!=str[j][k])return false;return true;}bool same2(int i,int j)//判断第i列和第j列是否相等{for(int k=0;k<r;k++)if(str[k][i]!=str[k][j])return false;return true;}int main(){while(~scanf("%d%d",&r,&c)){for(int i=0;i<r;i++){scanf("%s",str[i]);}int i,j;j=nexts[0]=-1;i=0;while(i<r)//行的kmp{if(j==-1||same1(i,j)){i++,j++;nexts[i]=j;}elsej=nexts[j];}int ans1=r-nexts[r];j=nexts[0]=-1;i=0;while(i<c){if(j==-1||same2(i,j)){i++,j++;nexts[i]=j;}elsej=nexts[j];}int ans2=c-nexts[c];printf("%d\n",ans1*ans2);}}