POJ2185 最小覆盖矩阵 (二维KMP)

来源:互联网 发布:pm2.5数据接口 编辑:程序博客网 时间:2024/06/14 17:24

这题挺有意思的,主要把KMP理解透彻了,其实二维的可以看成一维的,原来是由单个字符组成的字符串,现在就是由字符串组成的字符串数组,在此基础上,其他操作和思想都是一样的,横向求一遍next数组,那么最小的可覆盖的子串长度为:len-next[len],同理再求一遍纵向的,相乘即可。

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;#define maxn 10005int nxt[maxn];char s[maxn][maxn],str[77][maxn],ss[maxn];int getnext(int len,char p[][maxn]){    int i,j;    nxt[0]=nxt[1]=0;    for(i=1;i<len;i++)    {        j=nxt[i];        while(j&&strcmp(p[i],p[j])) j=nxt[j];        nxt[i+1]=(!strcmp(p[i],p[j])?j+1:0);    }    return len-nxt[len];}int main(){    int c,r,i,j;    scanf("%d%d",&r,&c);    for(i=0;i<r;i++)        scanf("%s",s[i]);    for(i=0;i<c;i++)        for(j=0;j<r;j++)            str[i][j]=s[j][i];//把列转为行    int w=getnext(r,s);//宽    int h=getnext(c,str);//长  //  cout<<w<<' '<<h<<endl;    printf("%d\n",w*h);    return 0;}