题目链接:矩阵

题意:给定一个$m$行$n$列的$01$矩阵$($只包含数字$0$或$1$的矩阵$)$,再执行$q$次询问,每次询问给出一个$a$行$b$列的$01$矩阵,求该矩阵是否在原矩阵中出现过

思路:二维哈希,从矩阵的右下角为低位到矩阵的左上角为高位,先求出每一行的一维哈希值$h[i][j]$,在$a$行$b$列的$01$矩阵向下移动的过程中,先向下扩展成$a+1$行$b$列的$01$矩阵,再将最上面的一行减去,这样矩阵就会向下移动一格,设原来$a$行$b$列矩阵的哈希值为$t$,所以新矩阵的哈希值

$$res=t*p[b]+(h[i+1][j]-h[i+1][j-b]*p[b])-((h[i-a][j]-h[i-a][j-b]*p[b])*p[a*b])$$

用$set$存储每个子矩阵的哈希值,求出询问矩阵的哈希值,判断是否出现过

其他二维哈希的题目,令矩阵的右下角为低位、矩阵的左上角为高位,然后推一下公式即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set> using namespace std; typedef unsigned long long ull; const int N = ;
const int M = N * N;
const ull P = ; int n, m, a, b, k;
ull h[N][N], p[M]; ull Hash(ull f[], int l, int r)
{
return f[r] - f[l - ] * p[r - l + ];
} int main()
{
scanf("%d%d%d%d", &n, &m, &a, &b);
p[] = ;
for (int i = ; i <= n * m; i++)
p[i] = p[i - ] * P;
for (int i = ; i <= n; i++) {
char s[N];
scanf("%s", s + );
for (int j = ; j <= m; j++)
h[i][j] = h[i][j - ] * P + s[j] - '';
}
set<ull> st;
for (int i = b; i <= m; i++) {
ull t = ;
int l = i - b + , r = i;
for (int j = ; j <= n; j++) {
t = t * p[b] + Hash(h[j], l, r);
if (j > a) t -= Hash(h[j - a], l, r) * p[a * b];
if (j >= a) st.insert(t);
}
}
scanf("%d", &k);
while (k--) {
ull t = ;
char s[N];
for (int i = ; i <= a; i++) {
scanf("%s", s + );
for (int j = ; j <= b; j++)
t = t * P + s[j] - '';
}
if (st.count(t)) printf("1\n");
else printf("0\n");
}
return ;
}

AcWing - 156 矩阵(二维哈希)的更多相关文章

  1. 【BZOJ 2462】矩阵模板 (二维哈希)

    题目 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在 原矩阵中出现过. 所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...

  2. URAL - 1486 Equal Squares 二维哈希+二分

    During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...

  3. 【URAL 1486】Equal Squares(二维哈希+二分)

    Description During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued ...

  4. AcWing 156. 矩阵 (哈希二维转一维查询)打卡

    给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...

  5. POJ3690:Constellations(二维哈希)

    Constellations Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6822   Accepted: 1382 题目 ...

  6. BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash

    1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...

  7. 用Python实现根据角4点进行矩阵二维插值并画出伪彩色图

    哈哈,题目取得这么绕,其实就是自己写了一个很渣的类似图像放大的算法.已知矩阵四周的4点,扩展成更大的矩阵,中间的元素值均匀插入,例如: 矩阵: 1  2 3  4 扩展成3x3的: 1  1.5  2 ...

  8. UVA-11019 二维哈希算法

    UVA-11019 题意: 就是给你AB两个字符矩阵,问你B矩阵在A矩阵中的出现次数. 题解:  参考链接:https://blog.csdn.net/qq_38891827/java/article ...

  9. bzoj 2351 [BeiJing2011]Matrix——二维哈希

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2351 就是先把每行单独从左到右扫着乘一个 b1 哈希起来,然后再按列从上往下乘一个 b2 哈 ...

随机推荐

  1. c#中的位运算

    &与  全为1才是1 |或  全为0才是0 !非  两边相同时为1,不同时为0 ~取反  0变1,1变0,包括符号位 >>右移 溢出舍掉,正数补0,负数补1,移动n位:原数 / 2 ...

  2. 【NOIP2012普及组】质因数分解

    P1075 质因数分解 假期第一天就给一道入门难度的题写题解…… 这道题一开始就被我想复杂了:埃式筛,欧拉筛……然而开一个1e9的数组?不现实. 直到看到题解区的dalao用唯一分解定理: 算术基本定 ...

  3. sql注入学习笔记 详解篇

    sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...

  4. spring自动装配和通过java实现装配

    1.组建扫描 在类上添加注解@Component注解可以实现组建扫描 @Component public class A{ ... } 2.自动装配 通过在属性上或者方法上添加@Autowired注解 ...

  5. 用eclipse中自带的jetty启动项目

    1.建立datasources.xml,创建jndi <jee:jndi-lookup id="datasource" jndi-name="jndiname&qu ...

  6. Java之字符串输入next()与nextLine()

            next():一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其去掉: 只有在输入有效字符之后,next( ...

  7. 如何删除github中的repository

    打开个人界面->点击进入想删除的repository的界面->拉到最下面的danger zone->delete

  8. 安装符合rancher2.x要求的docker

    安装符合rancher2.x要求的docker 待办 https://rancher.com/docs/rancher/v2.x/en/installation/requirements/instal ...

  9. Spring Cloud Netflix Eureka【服务治理】

    一.简介 二.使用 一.源码分析

  10. python调用sqlite

    参考资料:https://www.liaoxuefeng.com/wiki/1016959663602400/1017801751919456  https://www.cnblogs.com/lia ...