题目链接:

http://acm.hust.edu.cn/vjudge/problem/129730

The Big Painting

Time Limit: 5000MS

题意

给你一个模板串和待匹配串,问模板串在待匹配串中出现的次数(这里的串是二维矩阵)

题解

每一行做前缀和哈希。

统计的时候先按列再按行,这样在做行的话我们可以利用滚动的形式,计算纵向的哈希值(既总的哈希值)

代码

  1. #include<map>
  2. #include<cmath>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstdio>
  6. #include<string>
  7. #include<cstring>
  8. #include<iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. #define X first
  12. #define Y second
  13. #define mkp make_pair
  14. #define lson (o<<1)
  15. #define rson ((o<<1)|1)
  16. #define mid (l+(r-l)/2)
  17. #define sz() size()
  18. #define pb(v) push_back(v)
  19. #define all(o) (o).begin(),(o).end()
  20. #define clr(a,v) memset(a,v,sizeof(a))
  21. #define bug(a) ;//cout<<#a<<" = "<<a<<endl
  22. #define rep(i,a,b) for(int i=a;i<(b);i++)
  23. typedef long long LL;
  24. typedef vector<int> VI;
  25. typedef pair<int,int> PII;
  26. typedef vector<pair<int,int> > VPII;
  27. const int INF=0x3f3f3f3f;
  28. const LL INFL=0x3f3f3f3f3f3f3f3fLL;
  29. const double eps=1e-8;
  30. //start----------------------------------------------------------------------
  31. const int maxn=2020;
  32. //P进制哈希
  33. const int P=123;
  34. unsigned long long H[maxn][maxn],xp[maxn*maxn],Val;
  35. int n1,m1,n2,m2;
  36. char s1[maxn][maxn],s2[maxn][maxn];
  37. //预处理出位权
  38. void pre() {
  39. xp[0]=1;
  40. rep(i,1,maxn*maxn) xp[i]=xp[i-1]*P;
  41. }
  42. //处理前缀和的哈希值
  43. void get_H() {
  44. Val=0;
  45. rep(i,1,n1+1) rep(j,1,m1+1) {
  46. Val=Val*P+(s1[i][j]-'a'+1);
  47. }
  48. clr(H,0);
  49. rep(i,1,n2+1) rep(j,1,m2+1) {
  50. H[i][j]=H[i][j-1]*P+(s2[i][j]-'a'+1);
  51. }
  52. }
  53. //枚举,匹配
  54. void solve() {
  55. int ans=0;
  56. for(int j=1; j<=m2-m1+1; j++) {
  57. unsigned long long tmp=0,tmp2=0;
  58. int lj=j-1,rj=j+m1-1;
  59. int i;
  60. for(i=1;i<=n1;i++){
  61. tmp=tmp*xp[m1]+H[i][rj]-H[i][lj]*xp[m1];
  62. }
  63. do{
  64. if(Val==tmp) ans++;
  65. tmp-=(H[i-n1][rj]-H[i-n1][lj]*xp[m1])*xp[m1*(n1-1)];
  66. tmp=tmp*xp[m1]+H[i][rj]-H[i][lj]*xp[m1];
  67. i++;
  68. }while(i<=n2+1);
  69. }
  70. printf("%d\n",ans);
  71. }
  72. int main() {
  73. pre();
  74. while(scanf("%d%d%d%d",&n1,&m1,&n2,&m2)==4&&n1) {
  75. rep(i,1,n1+1) scanf("%s",s1[i]+1);
  76. rep(i,1,n2+1) scanf("%s",s2[i]+1);
  77. get_H();
  78. solve();
  79. }
  80. return 0;
  81. }
  82. //end-----------------------------------------------------------------------
  83. /*
  84. 4 4 10 10
  85. oxxo
  86. xoox
  87. xoox
  88. oxxo
  89. xxxxxxoxxo
  90. oxxoooxoox
  91. xooxxxxoox
  92. xooxxxoxxo
  93. oxxoxxxxxx
  94. ooooxxxxxx
  95. xxxoxxoxxo
  96. oooxooxoox
  97. oooxooxoox
  98. xxxoxxoxxo
  99. */

UVALive - 6893 The Big Painting 字符串哈希的更多相关文章

  1. UVALive 6893 The Big Painting hash

    The Big Painting 题目连接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=122283#problem/J Descri ...

  2. HDU 1880 魔咒词典(字符串哈希)

    题目链接 Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一 ...

  3. 洛谷P3370 【模板】字符串哈希

    P3370 [模板]字符串哈希 143通过 483提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 看不出来,这题哪里是哈希了- 题目描述 如题,给定N个字符串(第i个 ...

  4. HDU2594 Simpsons’ Hidden Talents 字符串哈希

    最近在学习字符串的知识,在字符串上我跟大一的时候是没什么区别的,所以恶补了很多基础的算法,今天补了一下字符串哈希,看的是大一新生的课件学的,以前觉得字符串哈希无非就是跟普通的哈希没什么区别,倒也没觉得 ...

  5. LA 6047 Perfect Matching 字符串哈希

    一开始我用的Trie+计数,但是不是计多了就是计少了,后来暴力暴过去的…… 看了别人的代码知道是字符串哈希,但是仍有几个地方不理解: 1.26^500溢出问题 2.没考虑哈希碰撞? 跪求指点! #in ...

  6. AC日记——【模板】字符串哈希 洛谷 3370

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

  7. 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...

  8. 【NOIP模拟】Grid(字符串哈希)

    题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...

  9. 洛谷 P3370 【模板】字符串哈希

    洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...

随机推荐

  1. CDH升级 5.7.5 --> 5.13.3(tar包方式)

    博客园首发,转载请注明出处:https://www.cnblogs.com/tzxxh/p/9123231.html 一.准备 1.关闭cdh中的服务 hdfs.yarn等所有服务:关闭 cm-ser ...

  2. Zookeeper -- 命令

    zkServer.sh start //启动zk进程 zkServer.sh stop //关闭zk进程 zkServer.sh status //查看zk状态 zkCli.sh //启动本地zk客户 ...

  3. MQTT入门2 -- “Error: Invalid password hash for user nick.”和“Connection Refused: not authorised.”

    原文地址:https://www.cnblogs.com/NickQ/p/9277315.html 问题描述: 搭建好mosqitto环境后,利用无密码验证方式,成功通过测试. 但修改配置文件将匿名访 ...

  4. python list内部功能记录

    list.append(obj) 在列表末尾添加新的对象 list.count(obj) 统计某个元素在列表中出现的次数 list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用 ...

  5. 八球胜负 HDU-2537

    #include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ int a,b,n,i; c ...

  6. c语言宏

    使用 c语言的宏是在预处理时候对字符进行简单替换. 优点:1.如果要改一个变量,只需要改宏就可以了,也就是只改一次;2.宏函数展开和普通函数一样,但是它没有普通函数调用的过程,不需要压栈出栈等操作,所 ...

  7. UART学习之路(三)基于STM32F103的USART实验

    关于STM32串口的资料可以在RM0008 Reference Manual中找到,有中文版的资料.STM32F103支持5个串口,选取USART1用来实验,其对应的IO口为PA9和PA10.这次的实 ...

  8. angular5学习笔记 路由通信

    首先在路由字典中,接收值的组件中加上:/:id 在发送值的组件中,发送值的方式有几种. 第一种:<a routerLink="/detail/1">新闻详情1</ ...

  9. OpenStack入门篇(四)之KVM虚拟机介绍和管理

    1.查看虚拟机,启动虚拟机 [root@linux-node1 ~]# virsh list --all Id Name State --------------------------------- ...

  10. cdh中hdfs非ha环境迁移Namenode与secondaryNamenode,从uc机器到阿里;

    1.停掉外部接入服务: 2 NameNode Metadata备份: 2.1 备份fsimage数据,(该操作适用HA和非HA的NameNode),使用如下命令进行备份: [root@cdh01 df ...