萌新再次求助(
  • 板块灌水区
  • 楼主MKqwq_
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/3/8 19:46
  • 上次更新2023/11/5 02:17:47
查看原帖
萌新再次求助(
119618
MKqwq_楼主2021/3/8 19:46

problem


#include<bits/stdc++.h>
using namespace std;
int m,n,a,b,qu,t,t1;
unsigned long long bs=1333331,pw[1001],f[1001][1001],q[1000001],f1[1001][1001],pw1[1001],bs1=131,q1[1000001];
string s;
int 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 int gl1(int l,int s,int e){
	return f1[l][e]-f1[l][s-1]*pw1[e-s+1];
}
inline bool find(unsigned long long 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 q[r]==nm;
}
inline bool find1(unsigned long long nm){
	int l=0,r=t,mid;
	while(l<r){
		mid=(l+r)/2;
		if(q1[mid]<nm) l=mid+1;
		else if(q1[mid]==nm) return 1;
		else r=mid;
	}
	return q1[r]==nm;
}
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,pw1[0]=1;
	for(int i=1;i<=1001;++i) pw[i]=pw[i-1]*bs,pw1[i]=pw1[i-1]*bs1;
	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],f1[i][j]=f1[i][j-1]*bs1+mp[i][j]; 
	for(int i=1;i<=m-a+1;++i)
		for(int j=1;j<=n-b+1;++j){
			t++,t1++;
			for(int k=i;k<i+a;++k) q[t]=q[t]*bs+gl(k,j,j+b-1),q1[t1]=q1[t1]*bs1+gl1(k,j,j+b-1);
		}
	cin>>qu;	
	sort(q+1,q+t+1),sort(q1+1,q1+t1+1);
	while(qu--){
		unsigned long long tmp=0,tmp1=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],f1[i][j]=f1[i][j-1]*bs1+mp[i][j];
		for(int i=1;i<=a;++i) tmp=tmp*bs+gl(i,1,b),tmp1=tmp1*bs1+gl1(i,1,b);
		cout<<(find(tmp)&find1(tmp1))<<endl;
	}
	return 0;
}

/kk

2021/3/8 19:46
加载中...