UPC6976:矩阵模板(二维哈希)
提交: 32 解决: 14
[提交] [状态] [讨论版] [命题人:admin]
题目描述
给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。
所谓01矩阵,就是矩阵中所有元素不是0就是1。
所谓01矩阵,就是矩阵中所有元素不是0就是1。
输入
输入第一行为M、N、A、B,参见题目描述。
接下来M行,每行N个字符,非0即1,描述原矩阵。
接下来一行为你要处理的询问数Q。
接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩阵。
接下来M行,每行N个字符,非0即1,描述原矩阵。
接下来一行为你要处理的询问数Q。
接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩阵。
输出
你需要输出Q行,每行为0或者1,表示这个矩阵是否出现过,0表示没有出现过,1表示出现过。
样例输入
3 3 2 2
111
000
111
3
11
00
11
11
00
11
样例输出
1
0
1
提示
对于100%的数据,N,M<=1000 A,B<=100
求二维前缀和
#include "bits/stdc++.h" using namespace std; typedef unsigned long long ull; const int maxn = 2000; const int base1 = 233, base2 = 2333; unsigned long long v[maxn][maxn]; map<ull, ull> mp; char str[5000]; int main() { freopen("input.txt", "r", stdin); int n, m, a, b,q; scanf("%d %d %d %d", &n, &m, &a, &b); for (int i = 1; i <= n; i++) { scanf("%s", str + 1); for (int j = 1; j <= m; j++) { v[i][j] = str[j] + v[i][j - 1] * base1 + v[i - 1][j] * base2 - v[i - 1][j - 1] * base1 * base2; } } unsigned long long c = 1, d = 1; for (int i = 1; i <= a; i++) { d *= base2; } for (int i = 1; i <= b; i++) { c *= base1; } for (int i = a; i <= n; i++) { for (int j = b; j <= m; j++) { mp.insert(make_pair(v[i][j] - v[i][j - b] * c - v[i - a][j] * d + v[i - a][j - b] * c * d, 1)); } } scanf("%d", &q); while (q--) { for (int i = 1; i <= a; i++) { scanf("%s", str + 1); for (int j = 1; j <= b; j++) { v[i][j] = str[j] + v[i][j - 1] * base1 + v[i - 1][j] * base2 - v[i - 1][j - 1] * base1 * base2; } } if (mp.count(v[a][b])) printf("%d\n", 1); else printf("%d\n", 0); } return 0; }