bzoj 2462 [BeiJing2011]矩阵模板 (hash)
来源:互联网 发布:2016淘宝助理手机版 编辑:程序博客网 时间:2024/05/22 17:22
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 2
111
000
111
3
11
00
11
11
00
11
Sample Output
1
0
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[N][N], power1[N], power2[N];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; 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;}
阅读全文
0 0
- bzoj 2462 [BeiJing2011]矩阵模板 (hash)
- [BZOJ 2462 BeiJing2011矩阵模板]矩阵Hash
- [BZOJ]2462: [BeiJing2011]矩阵模板 二维hash
- bzoj 2462 [BeiJing2011]矩阵模板
- BZOJ 2462: [BeiJing2011]矩阵模板
- BZOJ 2462: [BeiJing2011]矩阵模板
- 2462: [BeiJing2011]矩阵模板
- 2462: [BeiJing2011]矩阵模板
- 2462: [BeiJing2011]矩阵模板
- BZOJ 2462: [BeiJing2011]矩阵模板 二维哈希
- BZOJ 2462/2351 [BeiJing2011]矩阵模板/[BeiJing2011]Matrix 二维哈希
- bzoj 2351: [BeiJing2011]Matrix(二维Hash)
- 【BeiJing2011】【BZOJ2462】矩阵模板
- BZOJ 2351 BeiJing2011 Matrix Hash
- BZOJ 2462 BeiJing 2011 矩阵模板 二维hash
- BZOJ 2462 BeiJing 2011 矩阵模板 二维hash
- BZOJ-2462&&2351 矩阵模板&&Matrix 暴力 or Hash orAC自动机 or KMP
- [BZOJ2462]矩阵模板(暴力||矩阵hash)
- 自定义TabLayout的下划线的长度
- html&JavaScript演练(计算器):获取HTML内容、函数、按钮(一)
- windows下mysql忘记root密码
- RunningMan FZU
- Deadbolt 2 Java
- bzoj 2462 [BeiJing2011]矩阵模板 (hash)
- 读取和写入配置文件
- 中科爱讯WiFi探针在公共安全管理系统的应用
- Matlab中维度的理解
- Switch与ToggleButton
- jemalloc横向分析(三) arena_run_split_large使用分配的chunk存放tcache
- nexus发布项目与创建工厂
- ssm整合意外报空指针
- HDU 6003 Problem Buyer(贪心)