给定一个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");
}
}

最新文章

  1. 基于UDP的网络编程
  2. 【《zw版&#183;Halcon与delphi系列原创教程》 zw_halcon人脸识别
  3. nodejs&amp;npm等概念梳理
  4. rt—移植笔记2(Lwip)
  5. atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o
  6. JAVA基础知识之JVM-——自定义类加载器
  7. C#中使用MySqlCommand执行插入语句后获取该数据主键id值的方法
  8. IDEA、Matlab 注释
  9. 01-Python的介绍_Python编程之路
  10. DAG 模型 stacking boxes 动态规划
  11. 通过WinAPI播放PCM声音
  12. linux 安装elasticsearch 可能遇到的问题
  13. 一个不错的工具推荐:JMeter
  14. MyEclipse中复制web项目,部署之后访问报错
  15. iOS学习笔记(1)— UIView 渲染和内容管理
  16. java线程系列文章之一(线程的安全性)
  17. 【第二周】Java实现英语文章词频统计
  18. js中删除数组中某一项的方法
  19. 基础篇:6.4)形位公差-基准 Datum
  20. side Effect

热门文章

  1. selenuim模块的使用 解析库
  2. Python--模块之sys模块、logging模块、序列化json模块、序列化pickle模块
  3. mysql的安裝
  4. 畜禽免疫系统使用LODOP打印
  5. AutoMapper用法 转载https://www.cnblogs.com/youring2/p/automapper.html
  6. upc组队赛3 Congestion Charging Zon【模拟】
  7. Sap Netweaver命令执行
  8. list列表操作(创建、增加、删除、取值)
  9. Python安装和使用教程(windows)
  10. 11-vim-撤销和删除命令-01-撤销