给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过。

输入格式

第一行四个整数M,N,A,B。

接下来一个M行N列的01矩阵,数字之间没有空格。

接下来一个整数Q。

接下来Q个A行B列的01矩阵,数字之间没有空格。

输出格式

对于每个询问,输出1表示出现过,0表示没有出现过。

数据范围

A≤100A≤100,M,N,B≤1000M,N,B≤1000,Q≤1000Q≤1000

输入样例:

3 3 2 2
111
000
111
3
11
00
11
11
00
11

输出样例:

1
0
1
题意:判断查询时输入的矩阵是否是上面那个的子矩阵
思路:哈希可以用快速判断是否相等,我们可以预处理出上面大矩阵的所有小矩阵的哈希值,我们每个位置再去遍历肯定不行那样就是(n*m)^2,会超时,我们可以利用哈希的加减性质,我们首先计算出每一行的前缀哈希值
然后我们再预处理子矩阵的时候利用哈希值合并的性质只用遍历每一行,这样就省去了一个m,不会超时,然后用map保留下来所有的值,后面查询时候也计算每个矩阵的哈希值即可,判断map中是否存在
因为我们的哈希只能记录一维的哈希值,二维的记录会极大可能发生冲突,只能用二维转化成一维再去记录,切记要用unsigned long long ,可能很多人会问为什么不用mod,因为ull自带mod功能
#include<bits/stdc++.h>
#define maxn 1005
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll m,n,a,b;
char str[maxn][maxn],s[maxn][maxn];
ull dp[maxn][maxn];
ull f[maxn];
map<ull,ll> mp;
void hash_code(){//记录所有行的前缀哈希值
for(int i=;i<=m;i++){
f[]=;
for(int j=;j<=n;j++){
dp[i][j]=dp[i][j-]*+str[i][j]-''+;
if(i==) f[j]=f[j-]*;
}
}
}
void init(){
for(int i=;i<=m-a+;i++){
for(int j=;j<=n-b+;j++){
ull sum=;
for(int k=i;k<i+a;k++){//利用哈希合并性质省去一层循环
sum=sum*f[b]+dp[k][j+b-]-dp[k][j-]*f[b];
}
mp[sum]=;
//printf("%llu\n",sum);
}
}
}
int main(){
scanf("%lld%lld%lld%lld",&m,&n,&a,&b);
for(int i=;i<=m;i++){
scanf("%s",str[i]+);
}
hash_code();
init();
ll q;
scanf("%lld",&q);
for(int i=;i<q;i++){
for(int j=;j<=a;j++){
scanf("%s",s[j]+);
}
ull sum=;
for(int j=;j<=a;j++){
for(int k=;k<=b;k++){
sum=sum*+s[j][k]-''+;
}
}
//printf("%llu\n",sum);
if(mp[sum]) printf("1\n");
else printf("0\n");
}
}

AcWing 156. 矩阵 (哈希二维转一维查询)打卡的更多相关文章

  1. php 二维转一维

    Array(    [0] => Array        (            [salesorderid] => 10001            [createdtime] =& ...

  2. Win10 UWP开发:摄像头扫描二维码/一维码功能

    这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...

  3. 三维码 & 二维码 & 一维码

    三维码 & 二维码 & 一维码 3D, 2D, 1D 防伪国家标准 -<结构三维码防伪技术条件> http://www.xinhuanet.com/tech/2019-12 ...

  4. AcWing - 156 矩阵(二维哈希)

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

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

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

  6. 2018牛客网暑期ACM多校训练营(第二场) J - farm - [随机数哈希+二维树状数组]

    题目链接:https://www.nowcoder.com/acm/contest/140/J 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K ...

  7. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

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

    传送门 二维哈希即可. 注意质数选的大一些,不然会超时. 还有插入的时候不判重居然比判重要快.. ——代码 #include <cstdio> int main() { ; ") ...

  9. AcWing 前缀和 一维加二维

    一维 #include<bits/stdc++.h> using namespace std; ; int n,m; int a[N],s[N]; int main(){ ios::syn ...

随机推荐

  1. Druid数据源配置入门

    Druid是什么 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...

  2. SVN server 服务端修改端口号

    SVN server 服务端修改端口号 在实际使用中可能当安装svn server 服务后,发现与后续其他程序端口冲突, 1.打开svn server 管理界面->操作->properti ...

  3. delphi xe 正则表达式

    Delphi XE 中自带了正则表达式的处理类TRegEx,包含在单元 RegularExpressions,使用时要uses 一下.      TRegEx 是一个结构 ,使用时不用释放.他内部还是 ...

  4. jQuery插件之——弹窗框(模态框)leanModal

    1.首先在网上下载jquery.leanModal.min.js,添加到你的页面参考网址:https://blog.csdn.net/NTDDLIN... LeanModal.js下载地址: http ...

  5. Java第四次作业—面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  6. POJ 3641 Pseudoprime numbers (数论+快速幂)

    题目链接:POJ 3641 Description Fermat's theorem states that for any prime number p and for any integer a ...

  7. activiti7从act_ge_bytearray表中查询资源文件并保存到桌面文件夹中

    package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  8. 对 HTTP HTTPS的认识

    1.HTTP:超文本传输协议 -以明文的形式传输 -效率更高,但是不安全 2.HTTPS:HTTP+SSL -传输之前数据先加密,之后在揭秘 -效率低,但是安全 3.get请求和post请求的区别 - ...

  9. python基础之基础数据类型1

    int 整形 数字用于计算和比较 python3没有long,python2有整形和长整型 十进制二进制转换方法 bin(10进制) ==二进制 0b(二进制) int("二进制" ...

  10. Linux部分常用命令详解(一)

    echo 命令详解 格式: echo string 显示普通字符: echo "it is a test" 或者 echo it is a test 显示转义字符: echo &q ...