bzoj 2462 [BeiJing2011]矩阵模板 (hash)
2017-07-26 15:55
357 查看
Description
给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。
所谓01矩阵,就是矩阵中所有元素不是0就是1。
Input
输入文件的第一行为M、N、A、B,参见题目描述。接下来M行,每行N个字符,非0即1,描述原矩阵。
接下来一行为你要处理的询问数Q。
接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩阵。
Output
你需要输出Q行,每行为0或者1,表示这个矩阵是否出现过,0表示没有出现过,1表示出现过。
Sample Input
3 3 2 2111
000
111
3
11
00
11
11
00
11
Sample Output
10
1
题解
这题还有一道一模一样的,是道权限题,只有大佬才能享受的尊贵VIP待遇23333蒟蒻我没有权限号就搞了这个来做。其实我也不是特别懂这个玄学玩意,就不多说了。代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; const int mod = 10007; const int base1 = 10016957; const int base2 = 10016959; unsigned int sum , power1 , power2 ; int n, m, a, b, q, num, head[N * N]; struct Node { int value, next; } hash[N * N]; void add(int key, int value) { num ++; hash[num].value = value; hash[num].next = head[key]; head[key] = num; } void Hash(unsigned int x) { int key = x % mod 4000 ; add(key, x); } bool check(unsigned int temp) { int key = temp % mod; for(int i = head[key]; i; i = hash[i].next) if(hash[i].value == temp) return true; return false; } int main() { scanf("%d %d %d %d", &n, &m, &a, &b); for(register int i = 1; i <= n; i ++) for(register int j = 1; j <= m; j ++) scanf("%1d", &sum[i][j]); for(register int i = 1; i <= n; i ++) for(register int j = 1; j <= m; j ++) sum[i][j] += sum[i - 1][j] * base1; for(register int i = 1; i <= n; i ++) for(register int j = 1; j <= m; j ++) sum[i][j] += sum[i][j - 1] * base2; power1[0] = power2[0] = 1; for(register int i = 1; i <= max(n, m); i ++) { power1[i] = power1[i - 1] * base1; power2[i] = power2[i - 1] * base2; } for(register int i = a; i <= n; i ++) for(register int j = b; j <= m; j ++) { unsigned int temp = sum[i][j] - sum[i - a][j] * power1[a] - sum[i][j - b] * power2[b] + sum[i - a][j - b] * power1[a] * power2[b]; Hash(temp); } scanf("%d", &q); while(q --) { for(register int i = 1; i <= a; i ++) for(register int j = 1; j <= b; j ++) scanf("%1d", &sum[i][j]); for(register int i = 1; i <= a; i ++) for(register int j = 1; j <= b; j ++) sum[i][j] += sum[i - 1][j] * base1; for(register int i = 1; i <= a; i ++) for(register int j = 1; j <= b; j ++) sum[i][j] += sum[i][j - 1] * base2; int temp = sum[a][b]; printf("%d\n", check(temp)); } return 0; }
相关文章推荐
- BZOJ 2462 BeiJing 2011 矩阵模板 二维hash
- BZOJ 2462 BeiJing 2011 矩阵模板 二维hash
- BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)
- [BZOJ]2462: [BeiJing2011]矩阵模板 二维hash
- BZOJ2462[Beijing2011]矩阵模板(二维Hash)
- [BZOJ2462] [BeiJing2011]矩阵模板(二维Hash)
- bzoj2462 [BeiJing2011]矩阵模板 hash
- BZOJ 2462: [BeiJing2011]矩阵模板 二维哈希
- BZOJ 2462: [BeiJing2011]矩阵模板
- 【BeiJing2011】【BZOJ2462】矩阵模板
- [bzoj2462] [BeiJing2011]矩阵模板
- BZOJ 2462: [BeiJing2011]矩阵模板
- 【bzoj2462】[BeiJing2011]矩阵模板
- 【kmp算法】【Rabin-Karp算法】bzoj2462 [BeiJing2011]矩阵模板
- BZOJ 2462: [BeiJing2011]矩阵模板
- bzoj 2462 [BeiJing2011]矩阵模板
- BZOJ 2462/2351 [BeiJing2011]矩阵模板/[BeiJing2011]Matrix 二维哈希
- 2462: [BeiJing2011]矩阵模板
- 2462: [BeiJing2011]矩阵模板
- [BZOJ2462]矩阵模板(暴力||矩阵hash)