本篇文章是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)\)操作也许能哈希出奇迹

最新文章

  1. nginx添加 nginx_heath模块
  2. swift 中数据类型那个的转换
  3. HDU 4911 (树状数组+逆序数)
  4. 升级到EF6 两个注意事项
  5. Vue.2.0.5-插件
  6. VS下遇到未能加载文件或程序集 错误
  7. bootstrap上传表单的时候上传的数据默认是0 一定要小心
  8. CSS中margin和position:relative的定位问题
  9. MySQL XtraBackup备份脚本
  10. js对象继承的问题
  11. R语言与分类算法的绩效评估(转)
  12. python 模块:csv
  13. Linux CentOS 6.5 配置网络
  14. 创建线程的第三种方式——使用Callable接口
  15. AJAX 应用
  16. windows旋转屏幕快捷键配置
  17. Nginx下关于缓存控制字段cache-control的配置说明 - 运维小结
  18. Django实战(一)-----用户登录与注册系统1(环境搭建)
  19. Redis的五种数据类型
  20. C语言学习中遇到的小问题(一)

热门文章

  1. 19-格子游戏(hdu2147博弈)
  2. 面试题:Java开发中的23种设计模式详解(转)
  3. Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建
  4. Glade编程
  5. 学习Vue.js需要了解的部分内容
  6. html页面的局部刷新
  7. httpd和apache的区别
  8. Java 5新特性 for each 和Iterator的选择
  9. 通过vb.net 和NPOI实现对excel的读操作
  10. Eclipse中连接数据库错误:com.microsoft.sqlserver.jdbc.SQLServerException: 之类的错误