本篇文章是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. mongo状态查看方法

    列举一些常用的mongodb状态查看方法. 1.mongostat 是mongdb自带的状态检测工具, inserts/s 每秒插入次数 query/s 每秒查询次数 update/s 每秒更新次数 ...

  2. Linux查看操作系统版本的几种方式

    Linux查看操作系统版本的几种方式: 1.uname -a 2.lsb_release -a 3.cat /etc/issue 4.cat /proc/version 5.cat /etc/redh ...

  3. storm源码分析之任务分配--task assignment

    在"storm源码分析之topology提交过程"一文最后,submitTopologyWithOpts函数调用了mk-assignments函数.该函数的主要功能就是进行topo ...

  4. python核心编程第2章课后题答案(第二版36页)

    2-5 Loops and Numbers a) i = 0    while i <11:     print i    i += 1 b) for i in range(0,11): pri ...

  5. 【Java】对Map按key和value分别排序

    一.什么是Map? 在讲解Map排序之前,我们先来稍微了解下map. map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. ...

  6. 关于jeecms修改首页进行测试

    由于要学习,jeecms的标签使用,那么必须要有一个测试页.关于首页如何使之用之当测试页. 修改的步骤,找到web.xml文件修改 <welcome-file-list> <welc ...

  7. Django工程中使用echarts怎么循环遍历显示数据

    前言: 后面要开发测试管理平台,需要用到数据可视化,所以研究了一下 先看下最后的图吧,单击最上方的按钮可以控制柱状图显隐 views.py # -*- coding: utf-8 -*- from _ ...

  8. EF Power Tools使用

    转载:http://blog.csdn.net/planisnothing/article/details/8532316 1.可以很方便根据数据库生成Code First模式的代码,如果是已有项目转 ...

  9. 《C#多线程编程实战》2.10 SpinWait

    emmm 这个SpinWait 中文是自旋等待的意思. 所谓自旋,就是自己追自己影子,周伯通的左右手互博,不好听就是放屁自己追着玩,小狗转圈咬自己的尾巴 SpinWait是一个结构体,并不是一个类. ...

  10. SQL数据库查询语言(1)

    目录 MySQL数据库 MySQL安装与配置 DDL数据定义语言 创建数据库 查看.删除数据库 修改.备份.恢复数据库 创建表 修改表 MySQL常用数据类型 DML数据操纵语言 Insert语句 m ...