字符串哈希模板

假设一个字符串的范围是 [ 1 , n ] ,然后从中选择一个位置x,使得字符串分成两部分 [ 1 , x ] , [ x + 1 , n ] , 两个串的哈希值分别为 x , y ,那么将后面的串移动到前一个串的前面的哈希值为 x + y × p x
——————————————————————————————————————————————————————————————————————
学了一天的字符串哈希,还是不怎么懂,下面写出来我的一些微薄的理解。

模板等做题了再贴!

翻了很多博客,发现就是没人介绍关于求区间字串的哈希值的方法,希望有大佬能为萌新解答一下。

经过 h a s h 处理后,在哈希数组 h 中,单个的 h a s h [ i ] 表示的不仅仅是简单的前缀和,这与前面乘的系数 p 有关。

这里写图片描述
这里写图片描述

又发现了一个规律: h a s h [ i , j ] 区间的值其实就是 s [ i ] p ( j i ) + s [ i + 1 ] p ( j i 1 ) + . . . . . + s [ j ] ;

举个例子, h a s h ( 2 , 4 ) 就是 s [ 2 ] p 2 + s [ 3 ] p + s [ 4 ]

这里写图片描述

当确定一个区间的哈希值的时时候,假设当是[lL,R],那么如果R变大,那么整体哈希值的变化就是先乘上种子p,然后再加上R+1的值,如果是区间减少变成[L+1,R]那么哈希值的变化就是减去L对应这一位的哈希值
—————————————————————————————————————————
2018年4月24日更新

发现了一个哈希+线段树的题目,这里就要求区间的合并,于是去推了下公式, h a s h ( i , j ) = h a s h [ i , k ] s e e d ( j k + 1 ) + h a s h [ j , k ] ;

—————————————————————————————————————————
2018年4月28日更新

今天又学到了一种骚操作——如何计算将原字符串改变若干个字母后的哈希值。(不过有一个限制,就是在求字符串的哈希是,只有一个变量,而不是开了一个数组记录每一位的哈希值)

公式推就不推了,只是记录下公式结果:
首先明确字符串下标从1开始,字符串长度是len,改变的元素是s[i],将s[i]要改为c

h = h + ( c s [ i ] ) p ( l e n i ) ;

阅读更多

更多精彩内容