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

字符串哈希板子

时间:2023-09-25 13:57:06浏览次数:41  
标签:const int 板子 char 哈希 字符串

字符串哈希板子

http://oj.daimayuan.top/course/7/problem/485
单哈希

# include<bits/stdc++.h>

using namespace std;
const int N = 2e5+10;
const int p = 9999971,base = 101;

int n,m;
char a[N],b[N]; //字符串a,b
int ha[N],hb[N],c[N]; //ha是a的哈希函数,hb是b的哈希函数
                      //c[i] = base的i次方

int main()
{
	cin>>n>>m;
	scanf("%s%s",a+1,b+1);
	c[0] = 1;
	for(int i=1;i<=n;i++) c[i] = c[i-1]*base%p;
	for(int i=1;i<=n;i++) ha[i] = ( ha[i-1]*base+(a[i]-'a'))%p;
	for(int i=1;i<=m;i++) hb[i] = ( hb[i-1]*base+(b[i]-'a'))%p;
	int ans = 0;
	for(int i=1;i+m-1<=n;i++) 
	{
		if( (ha[i+m-1]-1ll*ha[i-1]*c[m]%p+p) % p == hb[m] ) ++ans;
	}
	cout<<ans<<endl;
	return 0;
}

双哈希

# include<bits/stdc++.h>

using namespace std;
const int N = 2e5+10;
const int p1 = 9999971,base1 = 101;
const int p2 = 9999973,base2 = 137;
int n,m;
char a[N],b[N];
int ha1[N],hb1[N],c1[N],c2[N],ha2[N],hb2[N];

int main()
{
	cin>>n>>m;
	scanf("%s%s",a+1,b+1);
	c1[0] = c2[0] = 1;
	for(int i=1;i<=n;i++) c1[i] = c1[i-1]*base1%p1;
	for(int i=1;i<=n;i++) c2[i] = c2[i-1]*base2%p2;
	for(int i=1;i<=n;i++) 
	{
		ha1[i] = ( ha1[i-1]*base1+(a[i]-'a'))%p1;
		ha2[i] = ( ha2[i-1]*base2+(a[i]-'a'))%p2;
	}
	for(int i=1;i<=m;i++) 
	{
		hb1[i] = ( hb1[i-1]*base1+(b[i]-'a'))%p1;
		hb2[i] = ( hb2[i-1]*base2+(b[i]-'a'))%p2;
	}
	int ans = 0;
	for(int i=1;i+m-1<=n;i++) 
	{
		if( (ha1[i+m-1]-1ll*ha1[i-1]*c1[m]%p1+p1) % p1 == hb1[m] && (ha2[i+m-1]-1ll*ha2[i-1]*c2[m]%p2+p2) % p2 == hb2[m] ) ++ans;
	}
	cout<<ans<<endl;
	return 0;
}

在算竞中,单哈希或者自然溢出都是会被卡掉的,所以写的话就写双哈希就行

标签:const,int,板子,char,哈希,字符串
From: https://www.cnblogs.com/algoshimo/p/17727763.html

相关文章

  • 字符串处理函数
    1,字符串串联运算符2,SUBSTRING提取子串3,LEFT和RIGHT4,LEN和DATALENGTH5,CHARINDEX函数6,PATINDEX函数7,REPLACE替换8,REPLICATE复制字符串9,STUFF函数10,UPPER和LOWER函数11,RTRIM和LTRIM函数 字符串串联运算符由于业务需要,有的时候我们需要将两个字段(列)组合起来,中间加上分隔符,然后输出。......
  • 入门篇-其之四-字符串String的简单使用
    什么是字符串?在Java编程语言中,字符串用于表示文本数据。字符串(String)属于引用数据类型,根据String的源码,其头部使用class进行修饰,属于类,即引用数据类型。字符串的表示字符串使用双引号""表示,在双引号中你可以写任意字符。和前面定义并初始化基本数据类型的变量一样,定义最简单......
  • 树哈希学习笔记
    我们用字符串哈希可以判断字符串相等,那么判断树同构呢?两棵树同构,当且仅当存在将其中一棵树的节点打乱的方案,使得打乱后两棵树完全相同。树哈希,就是把字符串哈希搬到树上来。对于两棵同构的有根树,其哈希值相同。下面介绍一种构造方式。\[f_i=\sum\limits_{x\inson(i)}f_xp_{|......
  • 实现一致性哈希算法
    背景一致性哈希主要用于分布式系统解决数据存储与访问的负载问题,极大的提高了可用性与扩展性。分布式系统往往是把数据分布到不同的节点,这些节点可以动态的加入或离开集群,这样就需要考虑一些问题,如果按照传统的hash算法进行数据分布,动态扩缩节点就需要对数据进行rehash,数据量大或......
  • 一致性哈希算法实现(java)
    代码基本实现未完待续........... publicstaticvoidmain(String[]args){​TreeMap<Integer,String>hashNodes=newTreeMap<>();hashNodes.put(1,"1.1.1.1");hashNodes.put(4,"1.1.1.2");hashNodes.put......
  • golang 对字符串进行base64编解码、md5 编码
    内容来自对chagpt的咨询一、对字符串进行base64编解码base64编码要在Go语言中对字符串进行base64编码,你可以使用标准库中的encoding/base64包。以下是一个简单的示例:packagemainimport( "encoding/base64" "fmt")funcmain(){ data:="Hello,World!" enc......
  • sqlserver判断字符串是否是数字
    sql2005有个函数ISNUMERIC(expression)函数:当expression为数字时,返回1,否则返回0。这只是一个菜鸟级的解决办法,大多数情况比较奏效。eg:selectISNUMERIC('123')--结果为1但是,该函数有个缺点!eg:复制代码 SELECT  ,ISNUMERIC('-')as'-'  --1 ,ISNUMERIC('+')as'+'  -......
  • python字符串的运用
    字符串str字符串[切片位置,按几个几个来切]center(填补个数,符号)两边填补Count(计算符号,区域)计算数字endweith(判断的东西)判断结尾Startweith(同上)判断开头Find(同上)字符查找isdigit是不是整数isdecimal是不是小数"连接符".join("l")拼接字......
  • 字符串转16进制,16进制转Base64 哈哈哈 uf65/rn+
    测试:哈哈哈uf65/rn+场景描述:对接java接口,字符串转16进制再转base64;遇到转换不一样问题;后来定位对方编码格式不对; privatevoidTest(){stringstr="哈哈哈";str=GetHexByString(str,Encoding.GetEncoding("GB18030"));//Encodi......
  • nodejs 字符串、数组、对象之间的相互转换
    vararr=['a','b','李四']varstr=JSON.stringify(arr)console.log(typeofstr)varobj={name:'liuneng',age:56,sex:'女'}varstr1=JSON.stringify(obj)console.log(typeofstr1)//字符串转对象//对字符串要求很高,需要单引号包住双......