本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了)

一维递推
首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\)
\(f(S)=\sum_{i=1}^{m}s[i]*p^{m-i} \mod q\)

那么在一个长度为\(n\)的文本串中找长度为\(m\)的子串,设该子串的首位下标为\(i\)
\(f(S_i)=\sum_{j=i}^{m+i-1}s[j]*p^{(m+i-1)-j} \mod q\)

\(f(S_{i+1})=\sum_{j=i+1}^{m+i}s[j]*p^{m+i-j} \mod q\)

\(f(S_{i+1})=p*[\sum_{j=i}^{m+i-1}s[j]*p^{(m+i-1)-j}]-p^m*s[i]+s[i+m] \mod q\)

\(f(S_{i+1})=p*f(S_i)+s[i+m]-p^m*s[i] \mod q\)

二维扩展
设文本串为二维,维度尺寸分别为\(n1,n2\),模式串也为二维,\(m1≤n1,m2≤n2\)
对于模式串的处理
\(f_2(S)=\sum_{i1=1}^{m1}\sum_{i2=1}^{m2}p_1^{m1-i1}*p_2^{m2-i2}*s[i1][i2] \mod q\)
对于一个文本串中开始下标为\(i1,i2\),尺寸大小为\(m1,m2\)的子串
\(f_2(S_{i1,i2})=\sum_{j1=i1}^{m1+i1-1}\sum_{j2=i2}^{m2+i2-1}p_1^{(m1+i1-1)-j1}*p_2^{(m2+i2-1)-j2}*s[j1][j2] \mod q\)

\(f_2(S_{i1,i2+1})=\sum_{j1=i1}^{m1+i1-1}\sum_{j2=i2+1}^{m2+i2}p_1^{(m1+i1-1)-j1}*p_2^{(m2+i2)-j2}*s[j1][j2] \mod q\)

\(f_2(S_{i1,i2+1})=\sum_{j1=i1}^{m1+i1-1}p_1^{(m1+i1-1)-j1}(p_2*\sum_{j2=i2}^{m2+i2-1}s[j1][j2]*p_2^{(m2+i2-1)-j2}+s[j1][i2+m2]-p_2^{m2}*s[j1][i2]) \mod q\)

\(f_2(S_{i1,i2+1})=p_2*f_2(S_{i1,i2})+\sum_{j1=i1}^{m1+i1-1}p_1^{(m1+i1-1)-j1}*s[j1][i2+m2]-p_2^{m2}\sum_{j1=i1}^{m1+i1-1}p_1^{(m1+i1-1)-j1}*s[j1][i2] \mod q\)

三维扩展
我可去他妈的

动态匹配
1.拼接Hash
比较显然,\(f(S_1+S_2)=p^{len_2}f(S_1)+f(S_2)\)
2.截断Hash
可以看成上式的逆运算,\(f(S_1)=f(S_1+S_2-S_2)=\frac{f(S_1+S_2)-f(S_2)}{p^{len_2}}\)
3.插入Hash
如果在\(i\)后插入,先截去\(i+1\)后的部分,拼接插入部分,再拼接截去部分
4.删去Hash
同理
5.平衡树上维护Hash
\(f(S)=f(S_l)*(size[rc]+1)+f(s)*size[rc]+f(S_r)\)

要点:
1.\(p\)在不同的维度选取不同的数
2.\(q\)选取一个较大素数,至少大于\(n/k\),其中\(n=n1*n2...*nk\)
3.\(p^{i} \mod q ≠ 1,i∈[1,p-2]\)
(所以简单地说就是\(p\)和\(q\)都选大素数)

个人的口胡:
1.对于原字符串的值,可以再多加一层哈希映射,把每个值都映射为均不同与\(p\)和\(q\)的的素数,翻车概率down
2.unordered_map支持的\(O(1)\)操作也许能哈希出奇迹

Hash 日常摸鱼笔记的更多相关文章

  1. 【FCS NOI2018】福建省冬摸鱼笔记 day3

    第三天. 计算几何,讲师:叶芃(péng). dalao们日常不记笔记.@ghostfly233说他都知道了,就盼着自适应辛普森积分. 我计算几何基础不好……然而还是没怎么讲实现,感觉没听什么东西进去 ...

  2. 【FCS NOI2018】福建省冬摸鱼笔记 day2

    第二天. 同学还是不带本子记笔记.dalao. 第二天:图论,讲师:@ExfJoe 全程划水,前面都讲水算法[虽然我可能已经忘记了]什么最短路,Tarjan,最小生成树,2SAT,差分约束啥的,我现在 ...

  3. 【FCS NOI2018】福建省冬摸鱼笔记 day1

    省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...

  4. 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1

    记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...

  5. 【FCS NOI2018】福建省冬摸鱼笔记 day5

    第五天,也是讲课的最后一天. 数据结构专题,讲师:杨志灿 他的blog我似乎找不到了……以前肯定是在百度博客里面.但是现在百度博客消失了. PPT做的很有感觉,说了很多实用的技巧. 我觉得其实是收获最 ...

  6. 【FCS NOI2018】福建省冬摸鱼笔记 day4

    第四天. 动态规划专题,讲师:闫神 讲了一些DP优化技巧,然而思想难度好大啊……根本没想到能优化那地步,连DP方程都没有呢. 不过有几题我还是想明白了. 讲了单调队列,决策单调性,四边形不等式,斜率优 ...

  7. 可持久化Treap 赛前摸鱼笔记

    1.基本结构 随机化工具 unsigned int SEED = 19260817; //+1s inline int Rand(){ SEED=SEED*1103515245+12345; retu ...

  8. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  9. [日常摸鱼]bzoj1257余数之和

    题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...

随机推荐

  1. SQL Server 2008 R2 Express 不能启动

    今天,新安装了Sql Server 2008 R2 Express,准备部署相应系统,在完成了数据库还原,系统部署以后,从浏览器里输入系统网址,出现登录页面,登录时报错,无法连上数据库.在查找原因的过 ...

  2. cout/cin

    转载来源:http://baike.baidu.com/link?url=NiNaSw0pF7RqFO8u0jx8KWk9yOfFFYy24xCJlQ6_qMcw5_WBzRKOqsO6tfvvJbZ ...

  3. Chrome OS上可运行Linux

    说起Chrome OS,可能多数人第一时间联想的不是操作系统,而是在浏览器领域颇为流行的谷歌Chrome浏览器.其实,Chrome OS也是谷歌 旗下的一款产品,是一款Google开发的基于Linux ...

  4. golang学习

    1. 学习资源列表 https://github.com/golang/go/wiki 2. 最快的入门方法 直接通过代码学习 https://tour.go-zh.org 3. go指南 https ...

  5. OpenCV2.3.0在VS中的配置

    本文为cherish总结,这里先收藏着了啦啦啦!!! vs中配置时尽量在全局配置中修改,否则每次新建项目都需要重新配置全局配置步骤如下:1.“视图”菜单 -> (其他窗口->)属性管理器 ...

  6. Java IO RandomAccessFile 任意位置读/写

    随机读写类 RandomAccessFile的唯一父类是Object,与其他流父类不同.是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必 ...

  7. MongoDB整理笔记のSharding分片

    这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...

  8. EFCore扩展Select方法(根据实体定制查询语句)

    EFCore扩展Select方法(根据实体定制查询语句)  通常用操作数据库的时候查询返回的字段是跟 我们的定义的实体是不一致的,所以往往针对UI或者接口层创建大量的Model, 而且需要手动对应字段 ...

  9. 解决在cmder中bash(WSL)上下箭头不能使用问题

    有三种解决方式,第一种方式最简单实用 安装新版本wslbridge 这个解决方法最简单,最实用,下载第三方wslbridge,安装即可使用. 这时再进入cmder,运行bash.exe,可以发现上下左 ...

  10. <select>标签默认值设置

    <td> <label>操作类型:</label> <select id="operation_type" class="com ...