思路:用一个二维矩阵来存给出的n*m的图每一行的前缀hash值,找到n*m中每一个a*b的矩阵,相当于把矩阵变成一行来操作求出hash值,用stl中的哈希表来存每一个a*b大小的矩阵的哈希值。
对于询问的矩阵,求出哈希值后查询哈希表中是否存在这个值即可。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<unordered_set>
using namespace std;
typedef pair<int,int>PII;
typedef unsigned long long ull;
const int N=1010,M=N*N,pp=131;
int n,m,a,b;
ull h[N][N],p[M];
char aa[N];
ull get(ull h[],int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];
}
int main()
{
scanf("%d%d%d%d",&n,&m,&a,&b);
p[0]=1;
for(int i=1;i<=n*m;i++) p[i]=p[i-1]*pp;
for(int i=1;i<=n;i++)
{
scanf("%s",aa+1);
for(int j=1;j<=m;j++) h[i][j]=h[i][j-1]*pp+aa[j]-'0';
}
unordered_set<ull>ss;
for(int i=b;i<=m;i++)
{
ull s=0;
int l=i-b+1,r=i;
for(int j=1;j<=n;j++)
{
s=s*p[b]+get(h[j],l,r);
if(j>a) s-=get(h[j-a],l,r)*p[a*b];
if(j>=a) ss.insert(s);
}
}
int k;
scanf("%d",&k);
while(k--)
{
ull s=0;
for(int i=0;i<a;i++)
{
scanf("%s",aa);
for(int j=0;j<b;j++) s=s*pp+aa[j]-'0';
}
if(ss.count(s)) puts("1");
else puts("0");
}
return 0;
}