枚举答案然后hash判断即可
矩阵就把每一行接一起hash就行了
我用了双模双base,单模单base被卡了
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<vector>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define MAXN 110
#define MAXM 1010
#define eps 1e-8
#define ll long long
#define INF 1000000000
#define MOD 1000000007
int n;
int a[MAXN][MAXN];
int b[MAXN][MAXN];
map<ll,bool>h[4];
ll bas[4]={233,131,233,131};
ll mod[4]={1000000007,10000007,10000007,1000000007};
ll Ha(int l,int r,int L,int R,int I){
int i,j;
ll re=0;
for(i=l;i<=r;i++){
for(j=L;j<=R;j++){
re*=bas[I];
re+=a[i][j];
re%=mod[I];
}
}
return re;
}
ll Hb(int l,int r,int L,int R,int I){
int i,j;
ll re=0;
for(i=l;i<=r;i++){
for(j=L;j<=R;j++){
re*=bas[I];
re+=b[i][j];
re%=mod[I];
}
}
return re;
}
bool jud(int x){
int i,j,k;
for(k=0;k<4;k++){
h[k].clear();
}
for(i=x;i<=n;i++){
for(j=x;j<=n;j++){
for(k=0;k<4;k++){
h[k][Ha(i-x+1,i,j-x+1,j,k)]=1;
}
}
}
for(i=x;i<=n;i++){
for(j=x;j<=n;j++){
bool flag=1;
for(k=0;k<4;k++){
if(!h[k][Hb(i-x+1,i,j-x+1,j,k)]){
flag=0;
break;
}
}
if(flag){
return 1;
}
}
}
return 0;
}
int main(){
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&b[i][j]);
}
}
for(i=n;i;i--){
if(jud(i)){
printf("%d\n",i);
return 0;
}
}
printf("0\n");
return 0;
}
/*
*/