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

字符串哈希

时间:2023-11-12 17:22:23浏览次数:33  
标签:子串 code int res 哈希 字符串

方法

通常采用多项式 Hash 的方法,也就是说将字符串看做一个 b 进制的数。

进制数选择(大于所有字符对应的数字的最大值,且为质数),如:131 233 13331 19260817 等。

模数选择(双\(10^9\)的模数或者直接自然溢出):19260817 19660813 等。

然后就可以愉快的哈希了!

code(自然溢出)
ull hashh (string s) {
	ull res = 0;
	for (int i = s.size () - 1; i >= 0; i --) {
		res = (base * res + (s[i] - 'a'));
	}
	return res;
}

子串哈希

如何得到子串的哈希值呢?

可以先对字符串的每个前缀进行预处理,根据哈希方法:

定义字符串前缀的哈希值为 \(p_i=s_1×b^{i-1}+s_2×b^{i-2}+…+s_i\),

那么子串 \(s_{l-r}\) 的哈希值就为 \(p_{l-r}=p_{r}-p_{l-1}×b^{r-l+1}\) 。

这里的 \(b^{r-l+1}\) 可以通过预处理然后 \(O(1)\) 查询,也可以直接快速幂
\(O(\log n)\) 搞定。

code
void hashh (string s) {
	h[0] = s[0] - 'a' + 1;
	for (int i = 1; i < s.size(); i ++) {
		h[i] = h[i - 1] * base + s[i] - 'a' + 1;
	}
}

cin >> l >> r;
cout << h[r] - h[l - 1] * qpow (base, r - l + 1);

可以应用到字符串匹配。

标签:子串,code,int,res,哈希,字符串
From: https://www.cnblogs.com/21devoted/p/17827429.html

相关文章

  • python字符串操作
    python执行python脚本第一行#!/usr/bin/python 只对Linux/Unix用户适用,用来指定本脚本用什么解释器来执行。有这句时,加上执行权限后,可以直接用 ./ 执行,不然会出错,因为找不到python解释器。#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python......
  • 【9.0】Go语言基础之字符串
    【一】字符编码引入https://www.cnblogs.com/dream-ze/p/17826956.html【二】字符串操作【1】获取字符串的字节(byte)(1)英文字符packagemainimport"fmt"funcmain(){ //字符串 //【1】单独获取每个字符串的字节byte //定义字符串 word:="Helloworld!" fo......
  • JVM系列-第9章-StringTable(字符串常量池)-cnblog
    title:JVM系列-第9章-StringTable(字符串常量池)tags:-JVM-虚拟机categories:-JVM-1.内存与垃圾回收篇keywords:JVM,虚拟机。description:JVM系列-第9章-StringTable(字符串常量池)。cover:'https://gitee.com/youthlql/randombg/raw/master/logo/jvm.png......
  • 【补充】字符串的编码
    【一】ASCII码计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。......
  • 151. 反转字符串中的单词 1
    2023-11-11151.反转字符串中的单词-力扣(LeetCode)思路:         栈利用栈 很好想,很好写        这里是将字符部分存入list,再逆序取出,相当于栈了;可以直接利用栈,简单方便    还有其他思路解法-》2classSolution{publicStringreverseWo......
  • 牛客[编程题] HJ59 找出字符串中第一个只出现一次的字符
    HJ59找出字符串中第一个只出现一次的字符中等  通过率:32.27%  时间限制:1秒  空间限制:32M 描述找出字符串中第一个只出现一次的字符  数据范围:输入的字符串长度满足 1\len\le1000\1≤n≤1000  输入描述:输入一个非空字符串输出描述:输出......
  • C++ 使用getline():从文件中读取一行字符串
    getline()方法从cin输入流缓冲区中读取一行字符串。在此基础上,getline()方法还适用于读取指定文件中的一行数据,本节就给大家做详细的讲解。我们知道,getline()方法定义在istream类中,而fstream和ifstream类继承自istream类,因此fstream和ifstream的类对象可以调用ge......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用灵捷3.5......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用......
  • golang json 序列化、反序列化 字符串反序列化
    golangjson序列化、反序列化字符串反序列化在使用Golang进行开发时,经常会遇到需要将一段JSON字符串进行序列化和反序列化的情况。JSON是一种轻量级数据交换格式,常用于前后端数据传输、存储等场景。Golang提供了内置的encoding/json包来处理JSON的序列化和反序列化。JSON的序列化......