给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵。
最小覆盖矩阵类似于最小覆盖子串,只不过是扩展到二维而已。
最小覆盖子串必定是原串的前缀,对于矩阵,可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度。
同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了。
这里有一个地方要注意,如果求最小公倍数的过程中发现“行最小公倍数>=原矩阵宽度“时,可以确定最小覆盖矩阵的宽度与原矩阵一样。列也是一样的道理。因为原矩阵必定是它自己的覆盖矩阵。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[10001][76];
int nxt[10001];
int r, c;
int lcmr, lcmc;
int gcd(int x, int y)
{
if (x < y) return gcd(y, x);
if (y == 0) return x;
return gcd(y, x % y);
}
int lcm(int x, int y)
{
return x / gcd(x, y) * y;
}
void getRowNext(int p)
{
nxt[0] = -1;
int i = 0, j = -1;
while (i < c)
{
if (j == -1 || str[p][i] == str[p][j])
{
++i;
++j;
nxt[i] = j;
}
else j = nxt[j];
}
}
void getCol