代码 :
#include<bits/stdc++.h>
using namespace std;
int m,n,a,b,qu,t;
unsigned long long bs=13331,pw[1001],f[1001][1001],q[1000001];
string s;
bool mp[1001][1001];
inline int gl(int l,int s,int e){
return f[l][e]-f[l][s-1]*pw[e-s+1];
}
inline bool find(int nm){
int l=0,r=t,mid;
while(l<r){
mid=(l+r)/2;
if(q[mid]<nm) l=mid+1;
else if(q[mid]==nm) return 1;
else r=mid;
}
return 0;
}
int main(){
cin>>m>>n>>a>>b;
for(int i=1;i<=m;++i){
cin>>s;
for(int j=0;j<s.size();++j) mp[i][j+1]=s[j]-'0';
}
pw[0]=1;
for(int i=1;i<=1001;++i) pw[i]=pw[i-1]*bs;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j) f[i][j]=f[i][j-1]*bs+mp[i][j];
for(int i=1;i<=m-a+1;++i)
for(int j=1;j<=n-b+1;++j){
t++;
for(int k=i;k<i+a;++k) q[t]=q[t]*bs+gl(k,j,j+b-1);
}
cin>>qu;
sort(q+1,q+t+1);
while(qu--){
int tmp=0;
for(int i=1;i<=a;++i){
cin>>s;
for(int j=0;j<s.size();++j) mp[i][j+1]=s[j]-'0';
}
for(int i=1;i<=a;++i)
for(int j=1;j<=b;++j) f[i][j]=f[i][j-1]*bs+mp[i][j];
for(int i=1;i<=a;++i) tmp=tmp*bs+gl(i,1,b);
cout<<find(tmp)<<endl;
}
return 0;
}
错误样例:
5 5 2 5
00000
01000
11001
11111
00110
1
00000
01000
/kk
感谢