#include<bits/stdc++.h>
using namespace std;
int n,m,r,c,ans=0;
bool g1[51][51],g2[51][51];
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin >> g1[i][j];
cin >> r >> c;
for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) cin >> g2[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int pans=0;
bool flag=1;
for(int k=1;k<=r;k++){
if(i+k-1>n) break;
for(int p=1;p<=c;p++){
if(j+p-1>m) break;
if(g1[i+k-1][j+p-1]==g2[k][p]) pans++;
else{
flag=0;
break;
}
if(!flag) break;
}
}
if(flag) ans=max(ans,pans);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int pans=0;
bool flag=1;
for(int k=1;k<=r;k++){
if(i+k-1>n) break;
for(int p=1;p<=c-n+j;p++){
if(j+p-1>m) break;
if(g1[k][j+p]==g2[c-j+1+k][p]) pans++;
else{
flag=0;
break;
}
if(!flag) break;
}
}
if(flag) ans=max(ans,pans);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int pans=0;
bool flag=1;
for(int k=1;k<=r;k++){
if(i+k-1>n) break;
for(int p=1;p<=c;p++){
if(j+p-1>m) break;
if(g1[i+k-1][j+p-1]==g2[k][p]) pans++;
else{
flag=0;
break;
}
if(!flag) break;
}
}
if(flag) ans=max(ans,pans);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int pans=0;
bool flag=1;
for(int k=1;k<=r;k++){
if(i+k-1>n) break;
for(int p=1;p<=c;p++){
if(j+p-1>m) break;
if(g1[i+k-1][j+p-1]==g2[k][p]) pans++;
else{
flag=0;
break;
}
if(!flag) break;
}
}
if(flag) ans=max(ans,pans);
}
}
cout << ans;
return 0;
}