题目链接

序列上的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]\)就行。

用指针替掉数组的一维竟然慢点。。好吧毕竟也就一维,数据也不大。

  1. //106864kb 1520ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 500000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. #define P 100000000
  9. #define base1 12289
  10. #define base2 786433
  11. typedef unsigned int uint;//在这用unsigned long long好像没太大用吧...果然,光荣地T了
  12. const int N=1005;
  13. uint A[N][N],sum[N][N],pw1[N],pw2[N];
  14. bool Hash[P];
  15. char IN[MAXIN],*SS=IN,*TT=IN;
  16. inline int read()
  17. {
  18. int now=0;register char c=gc();
  19. for(;!isdigit(c);c=gc());
  20. for(;isdigit(c);now=now*10+c-'0',c=gc());
  21. return now;
  22. }
  23. inline int read01()
  24. {
  25. register char c=gc();
  26. for(;!isdigit(c);c=gc());
  27. return c-'0';
  28. }
  29. int main()
  30. {
  31. int n=read(),m=read(),r=read(),c=read();
  32. for(int i=1; i<=n; ++i)
  33. for(int j=1; j<=m; ++j) sum[i][j]=read01();
  34. pw1[0]=pw2[0]=1;
  35. for(int i=1; i<=n; ++i) pw1[i]=pw1[i-1]*base1;
  36. for(int i=1; i<=m; ++i) pw2[i]=pw2[i-1]*base2;
  37. for(int i=2; i<=n; ++i)//Row
  38. for(int j=1; j<=m; ++j) sum[i][j]+=sum[i-1][j]*base1;
  39. for(int i=1; i<=n; ++i)//Column
  40. for(int j=2; j<=m; ++j) sum[i][j]+=sum[i][j-1]*base2;
  41. for(int i=r; i<=n; ++i)
  42. for(int j=c; j<=m; ++j)
  43. {
  44. uint hash=sum[i][j]-sum[i-r][j]*pw1[r]-sum[i][j-c]*pw2[c]+sum[i-r][j-c]*pw1[r]
  45. *pw2[c];
  46. Hash[hash%P]=1;
  47. }
  48. for(int Q=read(); Q--; )
  49. {
  50. for(int i=1; i<=r; ++i)
  51. for(int j=1; j<=c; ++j) A[i][j]=read01();
  52. for(int i=2; i<=r; ++i)
  53. for(int j=1; j<=c; ++j) A[i][j]+=A[i-1][j]*base1;
  54. for(int i=1; i<=r; ++i)
  55. for(int j=2; j<=c; ++j) A[i][j]+=A[i][j-1]*base2;
  56. puts(Hash[A[r][c]%P]?"1":"0");
  57. }
  58. return 0;
  59. }
  1. //106864kb 1544ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 500000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. #define P 100000000
  9. #define base1 12289
  10. #define base2 786433
  11. typedef unsigned int uint;//在这用unsigned long long好像没太大用吧... 果然,光荣地T了
  12. const int N=1005;
  13. uint A[N][N],sum[N][N],pw1[N],pw2[N];
  14. bool Hash[P];
  15. char IN[MAXIN],*SS=IN,*TT=IN;
  16. inline int read()
  17. {
  18. int now=0;register char c=gc();
  19. for(;!isdigit(c);c=gc());
  20. for(;isdigit(c);now=now*10+c-'0',c=gc());
  21. return now;
  22. }
  23. inline int read01()
  24. {
  25. register char c=gc();
  26. for(;!isdigit(c);c=gc());
  27. return c-'0';
  28. }
  29. int main()
  30. {
  31. int n=read(),m=read(),r=read(),c=read();
  32. for(int i=1; i<=n; ++i)
  33. for(int j=1; j<=m; ++j) sum[i][j]=read01();
  34. pw1[0]=pw2[0]=1;
  35. for(int i=1; i<=n; ++i) pw1[i]=pw1[i-1]*base1;
  36. for(int i=1; i<=m; ++i) pw2[i]=pw2[i-1]*base2;
  37. for(int i=2; i<=n; ++i)//Row
  38. {
  39. uint *s=sum[i], *las=sum[i-1];
  40. for(int j=1; j<=m; ++j) s[j]+=las[j]*base1;
  41. }
  42. for(int i=1; i<=n; ++i)//Column
  43. {
  44. uint *s=sum[i];
  45. for(int j=2; j<=m; ++j) s[j]+=s[j-1]*base2;
  46. }
  47. for(int i=r; i<=n; ++i)
  48. for(int j=c; j<=m; ++j)
  49. {
  50. 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];
  51. Hash[hash%P]=1;
  52. }
  53. for(int Q=read(); Q--; )
  54. {
  55. for(int i=1; i<=r; ++i)
  56. for(int j=1; j<=c; ++j) A[i][j]=read01();
  57. for(int i=2; i<=r; ++i)
  58. {
  59. uint *s=A[i], *las=A[i-1];
  60. for(int j=1; j<=c; ++j) s[j]+=las[j]*base1;
  61. }
  62. for(int i=1; i<=r; ++i)
  63. {
  64. uint *s=A[i];
  65. for(int j=2; j<=c; ++j) s[j]+=s[j-1]*base2;
  66. }
  67. puts(Hash[A[r][c]%P]?"1":"0");
  68. }
  69. return 0;
  70. }

BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)的更多相关文章

  1. BZOJ2462[Beijing2011]矩阵模板(二维Hash)

    二维矩阵匹配问题,至今不知道Q的范围是多少,反正是要求做到读入复杂度. 二维Hash:就是一维的等效拓展,注意两维的Base不能相同. 其余就是一维Hash和二维前缀和的结合,可以自然溢出,据说概率很 ...

  2. BZOJ 2462: [BeiJing2011]矩阵模板

    2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Stat ...

  3. BZOJ 2462 [BeiJing2011]矩阵模板 矩阵哈希

    昨天卡了一天常数...然后发现吧$unsigned\space long\space long$改成$unsigned$就可以过了$qwq$ 先把每一行的前缀哈希求出,然后再竖着把每个前缀哈希值哈希起 ...

  4. BZOJ 2462 矩阵模板(二维hash)

    题意:给出一个n*m的01矩阵,以及k个a*b的01矩阵,问每个是否能匹配原来的01矩阵. 由于k个矩阵的长和宽都是一样的,所以把原矩阵的所有a*b的子矩阵给hash出来.然后依次查找是否存在即可. ...

  5. 牛客练习赛1 矩阵 字符串二维hash+二分

    题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...

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

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

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

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

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

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

  9. 【bzoj2351】[BeiJing2011]Matrix 二维Hash

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

随机推荐

  1. 利用 ASP.NET 的内置功能抵御 Web 攻击 (1)

    摘要: Dino 总结了最常见的 Web 攻击类型,并介绍了 Web 开发人员可以如何使用 ASP.NET 的内置功能来改进安全性. 一.ASP.NET 开发人员应当始终坚持的做法 如果您正在阅读本文 ...

  2. nodejs 配置服务自启动

    1安装包 输入以下命令,安装需要的包 npm install node-windows -g 2编写自启动js 在目标server.js目录下新建auto_start_nodejs.js文件,将以下j ...

  3. python之pip安装mysql-python失败

    前言 由于公司使用的python版本是python2,并且连接mysql的包是mysql-python,但是mysql-python 使用pip安装报错,需要C++环境等依赖,于是使用wheel直接安 ...

  4. Mysql导入脚本失败,提示需要SUPER权限

    1.删除: /*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ 2.查看增删函数有没有重复 3.删除: set GLOBAL log ...

  5. android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

    MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...

  6. C++资源之不完全导引

    1,前言 无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈.Stan Lippman先生曾在<C++ Primer>一书中指出“C++是最为难学的 ...

  7. C/C++的64位整型

    在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说,64位整型的定义方式有long long和__int64两种(VC还 ...

  8. IntelliJ IDEA快捷键:F12

    The F12 key moves the focus from the editor to the last focused tool window. 将焦点从编辑器移动到最后一个聚焦的工具窗口.

  9. CF 554B 找相同行

    给定一个由n*n块地砖铺成的房间,每块砖用0表示未打扫,1表示已打扫. 要求打扫时只能整列地扫,未打扫的会变为已打扫,已打扫的会变为未打扫.即1会变成0,而0会变成1,目标是 使最后整行为1的行数最大 ...

  10. #CSS margin-top父元素下落

    [我的解决方法] 给该父元素添加如下代码 border-top: 1px solid rgba(0,0,0,0); box-sizing:border-box; [原因] css2.1盒模型中规定的内 ...