Problem-solving ideas
The matrix size of this question is only 50, we can directly use hash to search.
First enumerate the lower right corner of the matrix selected by the two matrices, then enumerate the matrix size dichotomously, and take the maximum value.
Code
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ull unsigned long long
const ull p=131,q=313;
using namespace std;
int n,a[60][60],b[60][60],l,r,mid,ans;
ull hs1[60][60],hs2[60][60];
struct c{
ull x,y;
}base[60];
bool check(int mid,int x,int y,int xx,int yy){
return ((hs1[x][y]-hs1[x-mid][y]*base[mid].x-hs1[x][y-mid]*base[mid].y+hs1[x-mid][y-mid]*base[mid].x*base[mid].y)==
(hs2[xx][yy]-hs2[xx-mid][yy]*base[mid].x-hs2[xx][yy-mid]*base[mid].y+hs2[xx-mid][yy-mid]*base[mid].x*base[mid].y));
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&b[i][j]);
base[0].x=base[0].y=1ull;
for(int i=1;i<=n;i++) base[i].x=base[i-1].x*p;
for(int i=1;i<=n;i++) base[i].y=base[i-1].y*q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
hs1[i][j]=hs1[i-1][j]*p+a[i][j];
hs2[i][j]=hs2[i-1][j]*p+b[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
hs1[i][j]+=hs1[i][j-1]*q;
hs2[i][j]+=hs2[i][j-1]*q;
}
}
for(int sx=1;sx<=n;sx++)
for(int sy=1;sy<=n;sy++)
for(int tx=1;tx<=n;tx++)
for(int ty=1;ty<=n;ty++)
{
l=0,r=min(min(sx,sy),min(tx,ty));
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid,sx,sy,tx,ty))
{
ans=max(mid,ans);
l=mid+1;
}
else r=mid-1;
}
}
printf("%d",ans);
}