字符串hash主要应用在:

寻找长度为n的主串S中的匹配串T(长度为m)出现的位置或次数的问题属于字符串匹配问题。
类似的还有KMP,我也有讲解。

原理:

  1. 将字符串中的每一个字母都看做是一个数字(例:从a-z,视为1-26);

  2. 选取两个合适的互质常数 b和h,其中h要尽可能的大一点,为了降低冲突的概率。

  3. 定义哈希函数,H(C)=[c1∗b(m−1)+c2∗b(m−2)+...+cm∗b0]modhH(C)=[ c_1*b^{(m-1)} + c_2*b^{(m-2)} + . . . + c_m*b^0 ] mod \ hH(C)=[c1​∗b(m−1)+c2​∗b(m−2)+...+cm​∗b0]mod h

    1. C代表一个字符串,用C=c1 c2 c3 c4…cm;表示该字符串,其中 ci 表示从前向后数的第 i 个字符;
    2. 方括号[ ]内的表达式:c1b^(m-1) + c2b^(m-2) + . . . + c0*b^0 意为将字符串C当做 b进制数 来处理,b是基数;
    3. 关于对 h 取模,若b,h有公因子,那么不同的字符串取余之后的结果发生冲突的几率将大大大增加( 冲突:不同的字符串但 会有相同的hash值)
  4. 计算上一步H(C)H(C)H(C)的过程是递归实现的:H(C,k)为前 k 个字符构成的字符串的哈希值,(若不考虑取模):

   H(C,k+1)= H( C , k ) * b+c( k+1 );
  1. 判断 主串上 长度为 n 的任意子串 C '=c(k+1) c(k+2) c(k+3) . . . c(k+n) 与 待匹配串S=s1 s2 s3. . .sn 的哈希值是否相等,则:
  H(C ’)= H( C , k+n ) - H(C, k ) * b^n;

实现:

//模板是李煜东的信息进阶指南
char s[1000010];
unsigned long long f[1000010], p[1000010];
int n, q;
int main() {scanf("%s", s + 1);n = strlen(s + 1);cin >> q;p[0] = 1; // 131^0for (int i = 1; i <= n; i++) {f[i] = f[i-1] * 131 + (s[i]-'a'+1); // hash of 1~ip[i] = p[i-1] * 131; // 131^i}for (int i = 1; i <= q; i++) {int l1, r1, l2, r2;scanf("%d%d%d%d", &l1, &r1, &l2, &r2);if (f[r1] - f[l1-1] * p[r1-l1+1] == // hash of l1~r1f[r2] - f[l2-1] * p[r2-l2+1]) { // hash of l2~r2puts("Yes");} else {puts("No");}}
}

『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希相关推荐

  1. 『ACM-算法-枚举法』信息竞赛进阶指南--枚举方法

    你以为枚举是一个一个的找? 还真是 你以为枚举都是for循环? 还真是 但你真的会枚举吗?组合型枚举,指数型枚举,排列型枚举?难道你只会线形枚举? 你可太菜了! // 递归实现指数型枚举 vector ...

  2. 『ACM--算法--KMP』信息竞赛进阶指南--KMP算法(模板)

    简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹 ...

  3. 『ACM-算法-ST算法』信息竞赛进阶指南--区间最值问题的ST算法

    借助倍增和动态规划可以实现O(1)的时间复杂度的查询 预处理: ①区间DP 转移方程 f[i][j] = min(MAX同理)(f[i][j - 1],f[i + ][j - 1]) f[i][j]表 ...

  4. 『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)

    写在前面: 我们是主要是讲算法模板,即实现的代码,并不讲实现的原理 什么是树状数组? 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度 ...

  5. 『ACM-算法-离散化』信息竞赛进阶指南--离散化

    数据离散化是一个非常重要的思想. 为什么要离散化? 当以权值为下标的时候,有时候值太大,存不下. 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去. 打个比方,某个题目告诉你有104 ...

  6. 『ACM-算法-二分法』信息竞赛进阶指南--二分法

    写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理! 定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转化为验证结果. 流程: 首先需要估计答案的上下界,然后 ...

  7. 『ACM-数据结构』信息竞赛进阶指南--线段树

    我们主要是讲代码实现,不是讲基本原理! 什么是线段树? 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点 ...

  8. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树

    主要不是讲实现,是分享代码! 啥是字典树: Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎 ...

  9. 信息竞赛进阶指南--二叉堆(模板)

    啥是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值 ...

最新文章

  1. 简明python教程txt-Python:将 list 写入一个 txt 文件四种方法
  2. NJ4X源码阅读分析笔记系列(一)——项目整体分析
  3. 首次公开!菜鸟弹性调度系统的架构设计
  4. 国内厂商对鸿蒙系统的态度,鸿蒙系统4月上线,国内手机厂商态度很关键!小米、中兴出乎意料...
  5. 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)
  6. 什么是YARN?跟HBase和Spark比优势在哪?终于有人讲明白了
  7. Uncaught SyntaxError: Unexpected identifier异常
  8. Putty文件夹蓝色太暗问题
  9. php上传文件502,PHPStrom上传文件报502错误原因
  10. D1格式是720*576还是704*576
  11. php 滑块验证,实现一个滑块验证功能
  12. 上网本之必备网络工具推荐
  13. 【IoT】产品设计之市场概念:市场定位、产品定位、市场需求、产品需求
  14. linux垃圾文件清理,请问 如何linux 垃圾文件清理、
  15. 洛谷 P2119 魔法阵
  16. 傅立叶变换、Gabor变换与小波变换
  17. Ubuntu系统电池管理软件TLP(Thinkpad设置电池充电阈值)
  18. 345.反转字符串中的元音字母(Reverse Vowels of a String)
  19. [转贴]+[水贴]:) 好话连篇
  20. Word编辑论文,实现1.题目、摘要、关键词为通栏,正文为双栏 2.首页底端添加通栏脚注,在脚注中写作者简介,并使其实现悬挂对齐效果

热门文章

  1. mysql_fetch_array 失败_无语的出错,mysql_fetch_array()
  2. ES6 Proxy兼容polyfill实现
  3. Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定
  4. YII2操作mongodb笔记(转)
  5. this指针_C++:07this指针
  6. apk闪退_你家的电视盒子总是闪退?别砸,问题都在这了!
  7. php getid3,PHP getID3类的使用方法学习笔记【附getID3源码下载】
  8. python如何将utf-8编码文件改为ansi编码文件_Excel导入CSV文件乱码?两个小方法让文件正常显示...
  9. spark mongo java_Spark Mongodb集成 - Python版
  10. idea git 在文件上点了revert怎么复原_在 IntelliJ IDEA 中使用 Git,太方便了