http://poj.org/problem?id=2185
题意:给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
char str[10010][100];
int R,C;
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;
}
const int MAXN=10010;
int next[MAXN];
int main()
{
while(scanf("%d%d",&R,&C)==2)
{
for(int i=0;i<R;i++)scanf("%s",str[i]);
int i,j;
j=next[0]=-1;
i=0;
while(i<R)
{
while(-1!=j && !same1(i,j))j=next[j];
next[++i]=++j;
}
int ans1=R-next[R];
j=next[0]=-1;
i=0;
while(i<C)
{
while(-1!=j && !same2(i,j))j=next[j];
next[++i]=++j;
}
int ans2=C-next[C];
printf("%d\n",ans1*ans2);
}
return 0;
}
本文介绍了一种解决二维最小覆盖子串问题的算法实现,通过寻找矩阵中重复的行和列来确定最小覆盖子矩阵,该子矩阵的无限复制能够完全覆盖原矩阵。
686

被折叠的 条评论
为什么被折叠?



