萌新求调hash
  • 板块灌水区
  • 楼主MKqwq_
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/3/7 10:10
  • 上次更新2023/11/5 02:21:42
查看原帖
萌新求调hash
119618
MKqwq_楼主2021/3/7 10:10

problem


代码 :

#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

感谢

2021/3/7 10:10
加载中...