18pts求条
查看原帖
18pts求条
398152
MinimumSpanningTree最小生成树楼主2024/7/20 08:25
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1100;
const ll BASE1=131,BASE2=1331,MOD=1e9+7;
int n,m,qn,qm,q;
ll a[N][N],f[N][N],g[N][N],bs1[N]={1},bs2[N]={1},fq[N][N],gq[N][N],b[N][N];
bool flag[N];
char ch;
unordered_map<ll,bool> um;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>qn>>qm;
	for(int i=1;i<=max(n,m);i++) bs1[i]=(bs1[i-1]*BASE1)%MOD,bs2[i]=(bs2[i-1]*BASE2)%MOD;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>ch;
			a[i][j]=ch-'0'+1;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) f[i][j]=(((f[i][j-1]*BASE1)%MOD)+a[i][j])%MOD;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) g[i][j]=(((g[i-1][j]*BASE2)%MOD)+f[i][j])%MOD;
	} 
	for(int i=qn;i<=n;i++)
	{
		for(int j=qm;j<=m;j++) um[(g[i][j]+MOD*3-((g[i-qn][j]*bs2[qn])%MOD)-((g[i][j-qm]*bs1[qm])%MOD)-((g[i-qn][j-qm]*bs1[qm]*bs2[qn])%MOD))%MOD]=true;
	}
	cin>>q;
	while(q--)
	{
		for(int i=1;i<=qn;i++)
		{
			for(int j=1;j<=qm;j++)
			{
				cin>>ch;
				b[i][j]=ch-'0'+1;
			}
		}
		for(int i=1;i<=qn;i++)
		{
			for(int j=1;j<=qm;j++) fq[i][j]=(((fq[i][j-1]*BASE1)%MOD)+b[i][j])%MOD;
		}
		for(int i=1;i<=qn;i++)
		{
			for(int j=1;j<=qm;j++) gq[i][j]=(((gq[i-1][j]*BASE2)%MOD)+fq[i][j])%MOD;
		}
		um.count(gq[qn][qm])?cout<<"1\n":cout<<"0\n";
	}
	return 0;
}
2024/7/20 08:25
加载中...