首页 > 其他分享 >字符串哈希

字符串哈希

时间:2023-09-09 20:44:27浏览次数:36  
标签:dots long times 哈希 字符串 数是

字符串哈希

可以快速判断字符串是否相同(比KMP还快)

字符串前缀哈希法

先预处理出来所有前缀的哈希

str = "ABCDEFGHI";
h[0] = 0;
h[1] = "A"; // 哈希值
h[2] = "AB";
h[3] = "ABC";
h[4] = "ABCD";
...

求字符串哈希值的方法是将字符串看成一个p进制的数:

"ABCD"
第一位的数是:A - 1
第二位的数是:B - 2
第三位的数是:C - 3
第四位的数是:D - 4

则p进制数对应的十进制数为$(1\ 2\ 3\ 4)_p = (1\times p^3 + 2\times p^2 + 3\times p^1 + 4\times p^0)\mod{q} $

因为字符串可能很长,导致数字很大,所以最后要mod上一个比较小的数字q,映射到\(0\sim q-1\)

注:

  1. 第一步字符映射中不能映射成0,如\(A_p - 0\),则\(AA_p - 0\)
  2. 该方法不考虑冲突情况

经验:p = 131 或 13331,q = \(2^{64}\)

由此可以求出任何子段的哈希值:

pPcZ3jO.png

\[\begin{aligned} & h[R]\quad p^R\dots p^0 \\ & h[L-1]\quad p^{L-1}\dots p^0 \\ & \text{将其对齐:} \\ & h[R]\quad p^R\dots p^0 \\ & h[L-1]\times p^{R-L+1}\quad p^{R}\dots p^{R-L+1} \\ & \text{故最终公式为:}h[R]-h[L]\times p^{R-L+1} \end{aligned} \]

h数组使用unsigned long long类型,溢出也就相当于取模了

typedef unsigned long long ULL;
const int N = 100010, P = 131;
char str[N];
ULL h[N], p[N];
// p数组预处理P的多少次方
// h数组为个长度子串哈希

ULL get(int l, int r) { // 获取任意子串的哈希值
	return h[r] - h[l - 1] * p[r - l + 1];
}

p[0] = 1;
for (int i = 1; i <= n; i++) {
	p[i] = p[i - 1] * P;
	h[i] = h[i - 1] * P + str[i];
}

标签:dots,long,times,哈希,字符串,数是
From: https://www.cnblogs.com/-37-/p/17690113.html

相关文章

  • 205. 同构字符串
    给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本......
  • 初识python--python中的字符串
    python中的字符串1、字符串的定义与访问字符串的定义字符串是一种常见的数据类型=>数据容器的一种,一个变量中可以同时保存多个字符基本语法:使用双引号(三引号的形式支持字符串的换行)变量名称='字符串'变量名称="字符串"#三引号变量名称=''' 锄禾日当午, 汗滴......
  • js json用法 转json字符串 json对象( 重点看最后)
    jsjson:JSON.parse() //转为json对象。JSON.stringify() //转为JSON字符串。举例:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>jsjson举例</title></head><body><pid="demo"></p&g......
  • print r 替换字符串 避坑
    print(r'''Instance=Class_1()str_addr_arg=Instance.dict_configuration['地址3'],str_column='发货属性',list_filter=eval(Instance.dict_configuration['筛选1']),list_column=eval(Instance.dict_configuration['列名1&......
  • 《剑指Offer》-20-表示数值的字符串
    这种按照一定规则来验证字符串的题看起来很麻烦,想到另外一道类似的是验证IP地址……我觉得我理不清这个判断逻辑以及各个逻辑间的关系以控制逻辑 boolisNumber(strings){ //首先这个字符串可能得样式为 //[若干可能的空格][[+/-][num./num.num/.num/num]][E/e][[+/-]......
  • 31个必备的Python字符串方法总结
     字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。 1、Slicingslicing切片,按照一定条件从列表或者元组中取出部分元素(比如特定范围、索引、分割值)s='hello's=s[:]print(s)#hellos='hello's=s[3:8]print(s)#hello 2......
  • 将pandas某列中的字符串按空格或换行符拆分成列表,然后剔除列表中的中文字符串
    要删除PandasDataFrame中某一列中的汉字字符,然后将该列的字符串按空格或换行符拆分成列表,可以按照以下步骤进行:假设你有一个名为df的DataFrame,要操作的列名为'某列':importpandasaspd#创建示例DataFramedata={'某列':['Hello你好','Thisisatest','Python编......
  • 字符串连接原理
    title:字符串连接原理index_img:img/2.svgtags:-JavaSE-字符串categories:-JavaSEhide:falseexcerpt:字符串拼接方式、效率、对象使用+运算符无变量参与运行前就直接拼接为一个字符串publicclassMain{publicstaticvoidmain(String[]arg......
  • 为什么使用int而不是字符串
    title:为什么使用int而不是字符串index_img:https://picss.sunbangyan.cn/2023/07/30/stdtw2.jpgtags:-JavaSE-字符串categories:-JavaSEhide:falseexcerpt:int、字符串效率更高整数数据类型在计算机中的存储和处理效率更高整数是基本的数值类型,......
  • 负载均衡之一致性哈希算法详解
    负载均衡之一致性哈希算法详解传统的哈希是直接把数据映射到对应的hash表上,但是当我们的数据量很大的时候,我们会采用多个hash节点来存储的方式来减少存储压力。但是这种hash算法下,如果我们的节点发生了增加或减少的时候,我们就需要将所有数据,重新建立映射关系,这会导致大量的数据......