您的位置:首页 > 其它

[BZOJ2462] [BeiJing2011]矩阵模板(二维Hash)

2017-05-16 16:15 369 查看

传送门

 

二维哈希即可。

注意质数选的大一些,不然会超时。

还有插入的时候不判重居然比判重要快。。

 

——代码

#include <cstdio>
#include <cstring>
#include <iostream>
#define UI unsigned int

const int p = 1000007, MAXN = 1001;
int n, m, a, b, q, cnt, head

, next[MAXN * MAXN]; UI h, sum[MAXN][MAXN], base1[MAXN], base2[MAXN], to[MAXN * MAXN]; inline void insert(UI x) { int i, a = x % p; for(i = head[a]; i ^ -1; i = next[i]) if(!(to[i] ^ x)) return; to[cnt] = x; next[cnt] = head[a]; head[a] = cnt++; } inline bool find(UI x) { int i, a = x % p; for(i = head[a]; i ^ -1; i = next[i]) if(!(to[i] ^ x)) return 1; return 0; } int main() { int i, j; scanf("%d %d %d %d", &n, &m, &a, &b); base1[0] = base2[0] = 1; memset(head, -1, sizeof(head)); for(i = 1; i <= n; i++) base1[i] = base1[i - 1] * 19260817; for(i = 1; i <= m; i++) base2[i] = base2[i - 1] * 20011001; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%1d", &sum[i][j]); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) sum[i][j] += sum[i - 1][j] * 19260817; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) sum[i][j] += sum[i][j - 1] * 20011001; for(i = a; i <= n; i++) for(j = b; j <= m; j++) { h = sum[i][j]; h -= sum[i - a][j] * base1[a]; h -= sum[i][j - b] * base2[b]; h += sum[i - a][j - b] * base1[a] * base2[b]; insert(h); } scanf("%d", &q); while(q--) { for(i = 1; i <= a; i++) for(j = 1; j <= b; j++) scanf("%1d", &sum[i][j]); for(i = 1; i <= a; i++) for(j = 1; j <= b; j++) sum[i][j] += sum[i - 1][j] * 19260817; for(i = 1; i <= a; i++) for(j = 1; j <= b; j++) sum[i][j] += sum[i][j - 1] * 20011001; printf("%d\n", find(sum[a][b])); } return 0; }

View Code [p] 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: