警钟长鸣(关于为什么不能只用KMP,而一定要有哈希))
查看原帖
警钟长鸣(关于为什么不能只用KMP,而一定要有哈希))
102457
personpeople楼主2024/9/16 20:04

开始弱智的我是这样子想的 每行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的矩阵为最小矩阵
大小为 2
5=10
事实上还是不对 最小矩阵应该是
ABAB
AABA
大小 2*4=8

2024/9/16 20:04
加载中...