基本根据第一篇题解来的
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define int unsigned long long
int n,m,a,b,T;
char s[1201][1201];
const int u1 = 131;
const int u2 = 13331;
int pow1[1201];
int pow2[1201];
int f[1201][1201];
int Hash(int n,int m,int s,int l)
{
return f[s][l]-f[n-1][l]*pow1[s-n+1]-f[s][m-1]*pow2[l-m+1]+f[n-1][m-1]*pow1[s-n+1]*pow2[l-m+1];
}
int S[1200001];
int cnt;
signed main()
{
cin>>T;
while(T--)
{
// printf("%ull\n",T);
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
{
cin>>s[i]+1;
}
cin>>a>>b;
pow1[0] = 1;
pow2[0] = 1;
for(i=1;i<=n;i++)
{
pow1[i] = pow1[i-1]*u1;
}
for(i=1;i<=m;i++)
{
pow2[i] = pow2[i-1]*u2;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
f[i][j] = f[i-1][j]*u1 + f[i][j-1] * u2 +(s[i][j]-'a') -f[i-1][j-1]*u1*u2;
}
}
cnt = 0;
for(i=1;i<=n-a+1;i++)
{
for(j=1;j<=m-b+1;j++)
{
S[++cnt] = Hash(i,j,i+a-1,j+b-1);
}
}
sort(S+1,S+cnt+1);
for(i=1;i<=a;i++)
{
cin>>s[i]+1;
}
for(i=1;i<=a;i++)
{
for(j=1;j<=b;j++)
{
f[i][j] = f[i-1][j]*u1 + f[i][j-1] * u2 +(s[i][j]-'a') -f[i-1][j-1]*u1*u2;
}
}
cout<<upper_bound(S+1,S+cnt+1,f[a][b])-lower_bound(S+1,S+cnt+1,f[a][b])<<endl;
}
}