思路:二维哈希,自然溢出取模
大数据一直挂,调了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");
}
}