开始弱智的我是这样子想的
每行kmp得到的最短前缀的最小公倍数*每列kmp得到的最小前缀的最小公倍数
#include <bits/stdc++.h>
using namespace std;
int r,c,ra=1,ca=1;
char a[10009][80];
void do_row(int x){
int j=0,fail[10009]={0};
fail[0]=0;
for(int i=2;i<=c;i++){
while(j&&a[x][i]!=a[x][j+1])j=fail[j];
if(a[x][i]==a[x][j+1])j++;
fail[i]=j;
}
int k=c-fail[c];
ra=ra/__gcd(k,ra)*k;
}
void do_column(int y){
int j=0,fail[10009]={0};
fail[0]=0;
for(int i=2;i<=r;i++){
while(j&&a[i][y]!=a[j+1][y])j=fail[j];
if(a[i][y]==a[j+1][y])j++;
fail[i]=j;
}
int k=r-fail[r];
ca=ca/__gcd(k,ca)*k;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++)cin>>a[i][j];
}
for(int i=1;i<=r;i++)do_row(i);
for(int i=1;i<=c;i++)do_column(i);
cout<<min(r*c,ra*ca)<<'\n';
return 0;
}
但是,我发现了一个 hack数据
2 5
ABABA
AABAA
最初,我认为 第一行是 AB循环
第二行是AAB循环
所以最小矩阵为
ABABAB
AABAAB
共 2*6=12
之后我发现,可以直接让最初 25的矩阵为最小矩阵
大小为 25=10
事实上还是不对
最小矩阵应该是
ABAB
AABA
大小 2*4=8