题目链接

文章目录

  • 题目描述
  • 题意:
  • 题解
  • 代码:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过。
输入描述: 第一行四个整数M,N,A,B。 接下来一个M行N列的01矩阵,数字之间没有空格。 接下来一个整数Q。
接下来Q个A行B列的01矩阵,数字之间没有空格。 输出描述: 对于每个询问,输出1表示出现过,0表示没有。

示例1
输入

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

输出

1
0
1

备注:
对于40%的数据,A = 1。
对于80%的数据,A≤10。
对于100%的数据,A≤100,M,N≤1000,Q≤1000。

题意:

给你个MN的二维矩阵,然后给你个AB的二维矩阵,问后者是否在前者出现过

题解

毫无疑问用hash
我们先想一个问题:
一个长为L的字符串a,问长度为len(len<L)的字符串b在a中出现过吗?
这个怎么做?
我们可以将a中长度为len的部分求出hash并放进哈希表,然后求出b的hash,进行比较即可

其实本题就是将一维问题转化成二维
我们将n * m的矩形中所有大小为a * b的矩形哈希一下并放到哈希表中,然后给出矩阵后,直接O(1)查找就可以了
求矩阵的hash的步骤:
先求出每一行前缀的hash,然后固定矩阵的一边长度b,求出长度为b的边的hash值,然后从这一行向下延伸a行,求出这a行对应的长度为b的hash值。当长度大于a后,就将最上面一行删去,始终保持为 a * b 的矩阵。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
typedef unsigned long long ull;
ull hash1[maxn][maxn];
ull base[maxn*maxn];
int base1=13;
char c[maxn];
ull get(ull hash1[],int l,int r)
{return hash1[r]-hash1[l-1]*base[r-l+1];
}
int q;
int n,m,a,b;
int main(){cin>>n>>m>>a>>b;base[0]=1;for(int i=1;i<=n*m;i++) base[i]=base[i-1]*base1;//素数倍数,用于查询子串哈希值 for(int i=1;i<=n;i++){scanf("%s",c+1);for(int j=1;j<=m;j++) hash1[i][j]=hash1[i][j-1]*base1+c[j]-'0';//求取每一行前缀哈希值 }unordered_set<ull> s;for(int i=b;i<=m;i++){ull x=0;int l=i-b+1,r=i;for(int j=1;j<=n;j++){x=x*base[b]+get(hash1[j],l,r);// 加上当前行的hash值 if(j>a) x-=get(hash1[j-a],l,r)*base[a*b];// 如果超行了,删去最上面一行 if(j>=a){s.insert(x);//用map来存哈希值,方便后面的判断是否存在 }}}cin>>q;while(q--){ull x=0;for(int i=0;i<a;i++){scanf("%s",c);for(int j=0;j<b;j++){x=x*base1+c[j]-'0';//将所给的矩阵转化成hash }}if(s.count(x))//利用map性质查询是否有这个数 cout<<"1"<<endl;else cout<<"0"<<endl;}return 0;
}

不过这样做,好像超内存了。。。
可以手写map会好些

Matrix(二维hash)相关推荐

  1. BZOJ2351[BeiJing2011]Matrix——二维hash

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

  2. bzoj 2351: [BeiJing2011]Matrix(二维Hash)

    2351: [BeiJing2011]Matrix Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 938  Solved: 303 [Submit] ...

  3. NEUQ 2015: Bitmap(二维hash)

    题目链接 题意 给一个N×NN × NN×N的矩阵问包含多少个M×MM×MM×M的子矩阵,子矩阵不一定完全相同,同时加上某个数相同也算 思路 首先差分,这样就可以直接找匹配的矩阵. 二维hash+容斥 ...

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

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

  5. 基于机器视觉的Data Matrix二维码识别

    基于机器视觉的Data Matrix二维码识别 二维码识别,这个在视觉应用中占有很重要的比例,各种各样的二维码都有可能需要识别.常见的QR码.Data Matrix码.本方案是识别Data Matri ...

  6. BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)

    题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...

  7. Data Matrix 二维码解码库 libdmtx 编译方法

    Data Matrix 二维码解码库 libdmtx 编译方法 libdmtx 是一个开源的 Data Matrix 编解码库.项目主页在:https://github.com/dmtx 这里简单记录 ...

  8. 期望dp ---- E. Vasya and Magic Matrix(二维转一维+前缀和优化的期望dp)

    题目链接 题目大意: 解题思路: 首先我们先把二维矩阵变成一维的(x,y)→(x−1)⋅m+y(x,y)\rightarrow(x-1)\cdot m+y(x,y)→(x−1)⋅m+y 然后对每个点按 ...

  9. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

最新文章

  1. Nature封面:每天工作21.5小时的AI化学家,8天内完成688个实验,已自主发现一种全新催化剂...
  2. python 分类变量xgboost_如何用XGBoost做时间序列预测?
  3. 为什么很多公司转型Go语言开发?Go语言能做什么
  4. logistic回归--好文
  5. Git知识总览(六) Git分支中的远程操作实践
  6. 使用Apache Cassandra设置SpringData项目
  7. leetcode1276. 不浪费原料的汉堡制作方案(贪心)
  8. 安装sql server 2000
  9. 数据结构期末复习之平衡二叉树
  10. 简述直方图和柱形图的区别_如何区分直方图与柱形图
  11. 【CCCC】L3-017 森森快递 (30分),线段树rmq模板+贪心排序
  12. tensorflow 函数查找
  13. hysys动态模拟教程_学习记录-过程模拟实训-Aspen HYSYS教程
  14. 使用Requests爬取网页图片并保存
  15. 性能优化,进无止境---内存篇
  16. 转载:Fiddler 教程
  17. FPGA基础知识1(FPGA芯片结构)
  18. 固态硬盘是什么接口_今天说事儿—固态硬盘接口,防你入坑
  19. java获取一年的周数、单周开始时间与结束时间、一年所有周开始时间与结束时间、月开始时间与结束时间
  20. html背景多图片拼接,将多个图片整合到一张图片中再用css_进行网页背景定位.

热门文章

  1. 【物理笑话】学过物理的人才能看懂的笑话,你能看明白几个?
  2. 嘘!偷偷教你们一个在双十一省钱的办法!
  3. 10分钟读懂人工智能、机器学习到底有什么关系
  4. 大数据|意不意外?今年卖得最好的月饼是这个馅的……
  5. linux ntfs 速度慢,将U盘磁盘格式改成NTFS解决u盘复制速度慢问题
  6. oracle asm磁盘头 备份,ASM磁盘头的第三个备份-Physically Addressed Metadata Redundancy
  7. chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
  8. python能不能自动写代码_微软最强 Python 自动化工具开源了!不用写一行代码
  9. itext设置pdf的尺寸_如何获取pdf文档iText 7的页面大小-问答-阿里云开发者社区-阿里云...
  10. 7-46 新浪微博热门话题 (30 分)(思路+详解+set + map)pta逐个点过的 来呀兄弟们