首页 > 其他分享 >字符串基础:Hash,KMP,trie

字符串基础:Hash,KMP,trie

时间:2024-04-24 12:22:56浏览次数:26  
标签:Hash trie hs long int ULL KMP 字符串

Hash

把一个字符串映射成一个整数,可以方便的比较两个字符串是否相等,

计算 \(Hash\) 值:

\[\displaystyle \sum_{i=0}^{len-1}(s[i] \times B^{len-1-i})(mod\;M) \]

这里的 \(B\) 是任取的一个大小合适的数,\(M\) 就是为了把算出来的值映射到 \([0,M-1]\) 的范围内,

既然是 \(mod\) ,就会有重复的值,也就是 “Hash碰撞”(“Hash冲突”),两个不相同的字符串映射到了同一个值上。

“Hash碰撞”不可避免,只要知道模数 \(M\) 就一定可以卡,一般 \(M\) 我们取一个较大的质数,

不常用的最好(防止常用的被卡),更方便的可以用 \(unsigned \;long \;long\) 的自然溢出,

最保险的是取双模数,即每个串 Hash 两个值,分别比较。

例题

code
#include<bits/stdc++.h>
using namespace std;
const int N = 1000005;
const int M = 99995699,B = 233;
typedef unsigned long long ULL;
int t,n,m;
string a,b;
ULL hs[1000005],p[1000005];
ULL gh(int l,int r)
{
	return (hs[r]-hs[l-1]*p[r-l+1]);
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		long long ans=0;
		cin>>a>>b;
		n=a.length(), m=b.length();
		p[0]=1;
		ULL tmp=0;
		for(int i=0;i<n;i++) tmp=tmp*B+a[i];
		for(int i=0;i<m;i++)
		{
			hs[i+1]=hs[i]*B+b[i];
			p[i+1]=p[i]*B;
		}
		for(int i=1,j=n;j<=m;j++,i++)
			if(gh(i,j)==tmp) ans++;
		printf("%d\n",ans);
	}
	return 0;
}

注意

字符串从 \(0\) 开始,

hs数组下标从 \(1\) 开始!!!(唐)

标签:Hash,trie,hs,long,int,ULL,KMP,字符串
From: https://www.cnblogs.com/ppllxx/p/18155009

相关文章

  • P3667 Bovine Genomics Hash+二分题解
    砂金听说了你在学字符串,于是在CLOI里出了道题给你P3667BovineGenomics题链:洛谷hzoi提高\(hash\)基础题。思路是二分答案,\(check\)中比较每一个区间字串的\(hash\)值是否相等。比较的时候可以用\(set\)或\(map\)。\(set\)的好处在于无重元素,判断时先将\(a\)串中区间子串......
  • 模块(time、datetime、os、random、日志logging、hashlib)
    【一】time模块【1】表示时间的三种方式时间戳元组(struct_time)格式化的时间字符串:格式化的时间字符串(FromatString):'1999-12-06'【2】时间转换(1)导入时间模块importtime(2)时间戳[1]生成时间戳importtime#生成时间戳,时间戳是浮点数类型time_str=time.time......
  • Ceph的crush算法与一致性hash对比介绍
    本文分享自天翼云开发者社区《Ceph的crush算法与一致性hash对比介绍》,作者:l****n首先,我们先回顾下一致性hash以及其在经典存储系统中的应用。一致性hash的基本原理一致性hash的基本思想是,有一个hash函数,这个hash函数的值域形成了一个环(收尾相接:thelargesthashvaluewraps......
  • 数据结构——入门到飞升——kmp算法
    给定一个字符串text和一个模式串pattern,求pattern在text中的出现次数。text和pattern中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern可重叠。输入格式:输入共两行,分别是字符串text和模式串pattern。输出格式:输出一个整数,表示pattern在text......
  • 字符串 hash
    前排提示,字符串哈希所需要的数理算力、代码能力都不低。但本质很基础。面对非“树上、图上字符串问题”:一方面:字符串hash的在任何一个模型上都不是理论最优解。大常数致使几乎只能达到\(5\times10^{5}\)每秒。另一方面:字符串hash的通用性、相对优性、相对易性,意味着它......
  • 什么是hashCode 以及 hashCode()与equals()的联系
    1、什么是hashCode:hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址,如Hashtable、hashMap中。为什么说hashcode可以提高检索效率呢?我们先看一个例......
  • hashlib模块
    摘要算法:只能加密不能解密加密算法:用方法加密加密后的字符串可以解密【一】什么是摘要算法Python的hashlib提供了常见的摘要算法如MD5SHA1等等。摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表......
  • time模块,datetime模块,os模块,random模块,logging模块,hashlib模块
    Ⅰtime模块【1】表示时间的三种方式#【1】时间戳表示时间:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数#我们当时给函数计时两次时间戳相减得到了消耗的总时间#【2】元组(struct_time)(年,月,日,时,分,秒,......
  • C++ STL -- HashTable
    HashTable一般常用的unordered_set、unordered_map都是基于哈希表实现的,哈希表主要需要注意的是哈希冲突,迭代器等基础哈希映射使用哈希函数将键映射到索引的数据结构。即将原始数组索引通过哈希函数映射到一个哈希值上,从而将一个大范围索引,减小到一个小的固定范围哈希冲突......
  • Java面试题:为什么HashMap不建议使用对象作为Key?
    HashMap是一种基于哈希表的动态数据结构,它允许使用任意不可变对象作为键(key)来存储和检索数据。然而,在某些情况下,使用对象作为HashMap的键可能会遇到一些问题。 首先,我们需要明确对象作为HashMap的键需要满足一些条件:不可变性:对象的属性不能被修改,因为如果属性被修改,那......