BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)
序列上的Hash和前缀和差不多,二维Hash也和二维前缀和差不多了。
预处理大矩阵所有r*c的小矩阵hash值,再对询问的矩阵Hash。
类比于序列上\(s[r]-s[l-1]*pow[r-l+1]\),比如\(s[i-r][j-c]\)多算了\(r*c\)次,乘个\(pow[r]*pow[c]\)就行。
用指针替掉数组的一维竟然慢点。。好吧毕竟也就一维,数据也不大。
//106864kb 1520ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define P 100000000
#define base1 12289
#define base2 786433
typedef unsigned int uint;//在这用unsigned long long好像没太大用吧...果然,光荣地T了
const int N=1005;
uint A[N][N],sum[N][N],pw1[N],pw2[N];
bool Hash[P];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int read01()
{
register char c=gc();
for(;!isdigit(c);c=gc());
return c-'0';
}
int main()
{
int n=read(),m=read(),r=read(),c=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j) sum[i][j]=read01();
pw1[0]=pw2[0]=1;
for(int i=1; i<=n; ++i) pw1[i]=pw1[i-1]*base1;
for(int i=1; i<=m; ++i) pw2[i]=pw2[i-1]*base2;
for(int i=2; i<=n; ++i)//Row
for(int j=1; j<=m; ++j) sum[i][j]+=sum[i-1][j]*base1;
for(int i=1; i<=n; ++i)//Column
for(int j=2; j<=m; ++j) sum[i][j]+=sum[i][j-1]*base2;
for(int i=r; i<=n; ++i)
for(int j=c; j<=m; ++j)
{
uint hash=sum[i][j]-sum[i-r][j]*pw1[r]-sum[i][j-c]*pw2[c]+sum[i-r][j-c]*pw1[r]
*pw2[c];
Hash[hash%P]=1;
}
for(int Q=read(); Q--; )
{
for(int i=1; i<=r; ++i)
for(int j=1; j<=c; ++j) A[i][j]=read01();
for(int i=2; i<=r; ++i)
for(int j=1; j<=c; ++j) A[i][j]+=A[i-1][j]*base1;
for(int i=1; i<=r; ++i)
for(int j=2; j<=c; ++j) A[i][j]+=A[i][j-1]*base2;
puts(Hash[A[r][c]%P]?"1":"0");
}
return 0;
}
//106864kb 1544ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define P 100000000
#define base1 12289
#define base2 786433
typedef unsigned int uint;//在这用unsigned long long好像没太大用吧... 果然,光荣地T了
const int N=1005;
uint A[N][N],sum[N][N],pw1[N],pw2[N];
bool Hash[P];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int read01()
{
register char c=gc();
for(;!isdigit(c);c=gc());
return c-'0';
}
int main()
{
int n=read(),m=read(),r=read(),c=read();
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j) sum[i][j]=read01();
pw1[0]=pw2[0]=1;
for(int i=1; i<=n; ++i) pw1[i]=pw1[i-1]*base1;
for(int i=1; i<=m; ++i) pw2[i]=pw2[i-1]*base2;
for(int i=2; i<=n; ++i)//Row
{
uint *s=sum[i], *las=sum[i-1];
for(int j=1; j<=m; ++j) s[j]+=las[j]*base1;
}
for(int i=1; i<=n; ++i)//Column
{
uint *s=sum[i];
for(int j=2; j<=m; ++j) s[j]+=s[j-1]*base2;
}
for(int i=r; i<=n; ++i)
for(int j=c; j<=m; ++j)
{
uint hash=sum[i][j]-sum[i-r][j]*pw1[r]-sum[i][j-c]*pw2[c]+sum[i-r][j-c]*pw1[r]*pw2[c];
Hash[hash%P]=1;
}
for(int Q=read(); Q--; )
{
for(int i=1; i<=r; ++i)
for(int j=1; j<=c; ++j) A[i][j]=read01();
for(int i=2; i<=r; ++i)
{
uint *s=A[i], *las=A[i-1];
for(int j=1; j<=c; ++j) s[j]+=las[j]*base1;
}
for(int i=1; i<=r; ++i)
{
uint *s=A[i];
for(int j=2; j<=c; ++j) s[j]+=s[j-1]*base2;
}
puts(Hash[A[r][c]%P]?"1":"0");
}
return 0;
}
BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)的更多相关文章
- BZOJ2462[Beijing2011]矩阵模板(二维Hash)
二维矩阵匹配问题,至今不知道Q的范围是多少,反正是要求做到读入复杂度. 二维Hash:就是一维的等效拓展,注意两维的Base不能相同. 其余就是一维Hash和二维前缀和的结合,可以自然溢出,据说概率很 ...
- BZOJ 2462: [BeiJing2011]矩阵模板
2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 915 Solved: 432[Submit][Stat ...
- BZOJ 2462 [BeiJing2011]矩阵模板 矩阵哈希
昨天卡了一天常数...然后发现吧$unsigned\space long\space long$改成$unsigned$就可以过了$qwq$ 先把每一行的前缀哈希求出,然后再竖着把每个前缀哈希值哈希起 ...
- BZOJ 2462 矩阵模板(二维hash)
题意:给出一个n*m的01矩阵,以及k个a*b的01矩阵,问每个是否能匹配原来的01矩阵. 由于k个矩阵的长和宽都是一样的,所以把原矩阵的所有a*b的子矩阵给hash出来.然后依次查找是否存在即可. ...
- 牛客练习赛1 矩阵 字符串二维hash+二分
题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...
- 【BZOJ 2462】矩阵模板 (二维哈希)
题目 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在 原矩阵中出现过. 所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- BZOJ2351[BeiJing2011]Matrix——二维hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- 【bzoj2351】[BeiJing2011]Matrix 二维Hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
随机推荐
- Hadoop生态圈-Azkaban实现hive脚本执行
Hadoop生态圈-Azkaban实现hive脚本执行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客中在HDFS分布式系统取的数据,而这个数据的是有之前我通过MapRed ...
- openstack项目【day23】:虚拟化介绍
本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...
- sql的执行流程
mysql中的SQL语句执行是有一定顺序的,如下:1. from2. on3. join4. where5. group by6. with7. having8. select9. distinct1 ...
- SQL语句(十一)函数查询
(十一)函数查询 1. 聚合函数 对一组值进行计算,得到一个返回值 SUM(), 求和 AVG(), 求平均 MIN(), 求最小 MAX(), 求最大 COUNT(), 计数,即个数 --例1 求所 ...
- js 正则学习小记之匹配字符串字面量
今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...
- 浅说Get请求和Post请求
Web 上最常用的两种 Http 请求就是 Get 请求和 Post 请求了.我们在做 java web 开发时,也总会在 servlet 中通过 doGet 和 doPost 方法来处理请求:更经常 ...
- 图文详解 解决 MVC4 Code First 数据迁移
在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题 这时可以删除数据库重新生成解决 但是之前的数据就无法保留 为了保留之前的数据库数据 我们需要使用到C ...
- mybatis动态sql——(六)
0 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 通过mybatis提供的各种标签方法实现动态拼接sql.
- oracel 复制A列的内容到列
update jieguo1 t set t.chinesetablename =t.tablezhushi where length(t.chinesetablename) >= 15 and ...
- Heapify
Given an integer array, heapify it into a min-heap array. For a heap array A, A[0] is the root of he ...