9pts求调
查看原帖
9pts求调
745929
Komeijizen楼主2024/7/29 21:12

思路:二维哈希,自然溢出取模
大数据一直挂,调了2h也没调出原因

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<unordered_map>

#define ll unsigned long long
using namespace std;
ll qs[1005][1005], ts[105][105];
ll hq[1005][1005], tq[105][105];
constexpr ll base1 = 233, base2 = 127;
int m, n, a, b, q;
unordered_map <ll, int>mp;
ll qpow(ll a, ll b) {
	ll res = 1;
	for (; b; b >>= 1) {
		if (b & 1)res = res * a ;
		a = a * a ;
	}return res ;
}
string ch;
int main() {
	cin >> m >> n >> a >> b;
	for (int i = 1; i <= m; i++) {
		cin >> ch;
		for (int j = 1; j <= n; j++)qs[i][j] = ch[j - 1] - '0'+1;
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			hq[i][j] = (hq[i - 1][j] * base1 + hq[i][j - 1] * base2 - (hq[i - 1][j - 1] * base1 * base2) + (ll)qs[i][j]);
		}
	}
	ll b1 = qpow(base1, a), b2 = qpow(base2, b);
	for (int i = a; i <= m; i++) {
		for (int j = b; j <= n; j++) {
			ll val = (hq[i][j] - hq[i - a][j] * b1  - hq[i][j - b] * b2+ hq[i - a][j - b] * b1 * b2 );
			mp[val] = 1;
		}
	}
	cin >> q;
	for (int i = 0; i < q; i++) {

		for (int j = 1; j <= a; j++) {
			cin >> ch;
			for (int k = 1; k <= b; k++)ts[j][k] = ch[k - 1] - '0'+1;
		}
		memset(tq, 0, sizeof(tq));
		for (int j = 1; j <= a; j++) {
			for (int k = 1; k <= b; k++) {
				tq[j][k] = tq[j - 1][k] * base1 + tq[j][k - 1] * base2 - (tq[j - 1][k - 1] * base1 * base2) + (ll)ts[j][k];
			}
		}
		if (mp[tq[a][b]] != 0) {
			puts("1");
		}
		else puts("0");
	}
}

2024/7/29 21:12
加载中...