-
题意: 给你一个字符矩阵,求出它的最小覆盖子矩阵,即使得这个子矩阵的无限复制扩张之后的矩阵,能包含原来的矩阵。 即二维的最小覆盖子串。
-
思路: 这题挺有意思的,主要把KMP理解透彻了,其实二维的可以看成一维的,原来是由单个字符组成的字符串,现在就是由字符串组成的字符串数组,在此基础上,其他操作和思想都是一样的,横向求一遍next数组,那么最小的可覆盖的子串长度为:len-next[len],同理再求一遍纵向的,相乘即可。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxn 10005
int 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);
}
retu