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,参见 ...
随机推荐
- zsh与oh-my-zsh是什么
zsh是bash的增强版,其实zsh和bash是两个不同的概念.zsh更加强大. 通常zsh配置起来非常麻烦,且相当的复杂,所以oh-my-zsh是为了简化zsh的配置而开发的,因此oh-my-zsh ...
- 被误解的 Node.js
http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/ 被误解的 Node.js
- 20155237 2016-2017-2 《Java程序设计》第7周学习总结
20155237 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识Lambda语法 Lambda 教材的引入循序渐近.深入浅出 Lambda去重复,回忆D ...
- ajax函数说明
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- F - A计划
题目链接: https://cn.vjudge.net/contest/254150#problem/F wa代码: #include<iostream> #include<stri ...
- python版本管理工具pyenv和包管理工具pipenv
一.pyenv版本管理工具 pyenv是一个python版本管理工具,可以实现轻松切换多个python版本 它可根据每个用户更改全局python版本,也可以为每个项目指定python版本,还可以管理v ...
- 如何生成能在没有安装opencv库及vs2010环境的电脑上运行的exe文件
项目基本算法已经完成,甲方需要一个可以运行的demo.目前,程序能在自己的电脑上正常运行.移植到其他win7系统上,运行失败. 寻找各种解决办法,baidu找到两个办法: 1.使用静态链接的方法,这种 ...
- MySQL性能剖析工具(pt-query-digest)【转】
这个工具同样来自percona-toolkit 该工具集合的其他工具 MySQL Slave异常关机的处理 (pt-slave-restart) 验证MySQL主从一致性(pt-table-chec ...
- Android 6.0 API
Android 6.0 (M) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的 API. 着手开发 要着手开发 Android 6.0 应用,您必须先获得 Android SDK,然后使 ...
- Linux 生产实习01
Linux 生产实习01 标签(空格分隔): Linux 2018.07.02 相关软件下载地址:Linux Study 0x01. 安装 VMware Workstation VMware Work ...