字符串hash(二)
从上一届已经讲了字符串hash的方法,hash后怎么用也很重要
文章目录
- 一.查询子串的hash值
- 查询子串减去期中一个字符后的hash值
- 查询两个子串拼接的hash值
**hash的模板(自然溢出)**
char s[10010];
ull hashs(char s[])
{int len=strlen(s);ull base=131;ull head[]=0;for (int i=1;i<=len;i++)head[i]=head[i-1]*base+(ull)s[i];return ans&0x7fffffff;//舍弃符号位
}
一.查询子串的hash值
base[x]表示base的x此方
head[1]=s1
head[2]=s1base[1]+s2
head[3]=s1base[2]+s2*base[1]+s3
…
我们可以得到:
字符串S中子串[l,r]的hash值为:
hash=hash[r]-hash[l-1]*base[r-l+1]
unsigned long long get_hash(int l, int r)
{return hash[r] - hash[l-1] * base[r-l+1];
}
查询子串减去期中一个字符后的hash值
查询字符串S中范围[l,r],但是去掉区间中坐标为x的字符串,问剩下的hash
其实就是将 [ l , r ] 分解成 [ l , x - 1 ] [x+1,r ],求这两块的hash
扩展一下,去掉哪里你就把区域在这里给拆开就行,分着求最后合在一起
但是注意,因为中间被你挖去一块,也就是 [ l , x - 1 ] 与 [ x+1,r ]并不是相连的,他们两个的hash值不能直接相加,很简单因为他们都是因为base的倍数乘积所以相连,所以讲前者(也就是[ l , x - 1 ] )强行左移r-x位(以base的进制),左移就是乘base的r-x次方
位移次数是右区间左端点与右端点之间的数量r-(x+1)+1
unsigned long long get_hash_delete(int l, int r, int x)
{return get_hash(l, x-1) * base[r-x] + get_hash(x+1, r);
}
多用以求最长回文子串或者回文子串数量,当然manacher、kmp能完成的更好
查询两个子串拼接的hash值
其实拼接和去除原理是一样的
拼接不就是去除倒嘛
所以代码原理和上面也差不多,两个区域[l,r]和[x,y]的哈希值,前者通过位移使得两个区域可以直接相加,位移的次数就是y-x+1(其实和上面一样的,你细品)
unsigned long long get_s1_s2(int l, int r, int x, int y)
{return get_hash(l, r) * p[y-x+1] + get_hash(x, y);
}
字符串hash(二)相关推荐
- 字符串hash(一)
很久没遇到过hash的题了,今天来重新温故一下 文章目录 序言 常用的几个字符串hash方法: hash公式(自然溢出) 讲解 模板 单hash 讲解 模板 双hash 讲解 代码 总结 序言 你有没 ...
- *【牛客 1 - A】矩阵(字符串hash)
题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...
- 字符串hash——Codeforces533F Encoding
题面:cf533f 简要题意:有A串和B串,两个串被判为相似的条件是满足在若干(或者没有)二元组 (x, y)表示将串中的所有x换成y,y换成x(x,y代表某个字母)之后,两个串相同.问有多少A的子串 ...
- Python基础数据类型之字符串(二)
Python基础数据类型之字符串(二) 一.字符串的常规操作 二.字符串的大小写转换 1.首字母大写 2. 每个单词首字母大写 3.大写转化为小写 4.所有字母变成大写字母 二.验证码忽略大小写 三. ...
- hdu4821 字符串hash
参考博客:点击打开链接 字符串hash典例. 这里用的是bkdrhash 法.也是最常用的冲突最少的一种.原理:把字符串和数值对应.这里用base=31(一般用质数), 先是扫一遍,处理处每个位子到结 ...
- hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))
题意这英语..反正我是读不懂== 题意:给定一个串,有多少M*L的子串,其中子串的M个子串不相同= (注:某一位不相同即为不相同) 很明显要On的扫,但是似乎前一个与后一个没有关系?是的,前第x个(x ...
- 字符串Hash的原理与应用
字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...
- 微信小程序业务-字符串生成二维码(weapp-qrcode)
微信小程序业务-字符串生成二维码(weapp-qrcode) 前言 邂逅weapp-qrcode 基本使用 详细参数 小程序组件中使用 image属性详解 想使用网络图片? 参考地址 前言 在小程序项 ...
- nssl1211-好文章【字符串hash,map】
正题 题目大意 求长度为n个一个字符串长度为m不同的子串个数 解题思路 用字符串hash判断字符串是否相同,然后时间复杂度O(n2)O(n^2)O(n2),然后我们因为自然溢出所以不能开桶,那就开ma ...
最新文章
- 反应器组件 ACE_Reactor
- Groovy全攻略--嵌入篇
- linux紧急救援模式,如何在 Ubuntu 18.04 中启动到救援模式或紧急模式
- 案例分析:FICO如何从VMware迁移到OpenStack
- nginx之206异常
- HTTP协议(异步和同步)
- atitit 需求条目的自动化生成原型html h5界面ui与解决方案
- 序章:企业潜规则认知
- coj #10066新的开始(最小生成树)
- AutoSAR入门到精通讲解 (AppL) 2.1 AutoSAR-CP AppL概述
- PX30 Android8.1 红外遥控实现
- flask框架----跨域
- “21 天好习惯”第一期-4
- 解决利用<input type=“file“>上传文件时,value拿到的是fakePath问题
- 最新小程序转化app的方法神操作
- 全民一起玩Python基础篇第六课:复杂结构初步(列表、对象、模块等)(下)
- 【附源码】Python计算机毕业设计农商行贷款管理系统
- 六级核心词汇61~100
- Failed to load config plugin:vue/essenti al to extend from.
- 如何助力银行精准营销
热门文章
- 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
- 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
- 朴素贝叶斯--文档分类
- mysql如何查询某条记录在分页的第几页_分页插件的使用
- jwt的token自动续约_JWT(JSON Web Token)自动延长到期时间
- 一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案
- mysql目录树_无限级目录树+记忆节点状态(PHP+mysql)
- java什么是静态_什么是java静态
- mysql 5.6.37 winx64_Mysql 5.6.37 winx64安装双版本mysql笔记记录
- 计算机基础知识教案1,计算机基础知识教案一