字符串hash补充(模数情况下)
字符串模板,在模数意义下的,比较好用
#include<stdio.h>
typedef long long LL;
/*【字符串哈希算法】
字符串哈希算法的提出,涉及到如何快速地求两个字符串是否完全相同。
如果是查询多个匹配串与某个模板串的相同性关系,我们可以用KMP实现。
而如果这些匹配串都是某个串的子串呢?从效率上和思维复杂度上讲,都不如用字符串哈希来实现!
什么是字符串哈希呢?比如,我们要哈希一个全为小写字符的串,串长最大为TOP。
1,我们决定取模数Z
2,我们决定字符集哈希数V
3,我们预处理V的幂值:v[0]=1;for(int i=1;i<=TOP;i++)v[i]=v[i-1]*V%Z;
4,我们求出模板串s的哈希值:
scanf("%s",s);
w=0;for(int i=1;s[i];i++)w=(w*V+s[i]-'a')%Z;
5,我们求出匹配串ss以任一位置为结尾的前缀哈希值:
scanf("%s",ss);
u[0]=0;for(int i=1;ss[i];i++)u[i]=(u[i-1]*V+ss[i]-'a')%Z;
6,当判定ss[l,r]是否与模板串s相同时,我们求得s[l,r]在同规则下的哈希值ww:
把前缀u[l-1]乘上v[r-(l-1)]的base,用u[r]-u[l-1]*v[r-(l-1)],就得到了纯后缀哈希值,也就是s[l,r]的哈希值。
即ww=(u[r]-u[l-1]*v[r-(l-1)]%Z+Z)%Z.
这时判定w与ww是否相同,就可以判匹配串是否与模板串相同啦。
需要事项1:
如果哈希值不同,那么两个串必定不同。
而就算哈希值相同,两个串依然存在可能性不同。
为了提高稳定性,我们可以取多个pair(取模数Z,字符集哈希数V)。利用两次哈希甚至是多次哈希,提高准确性。
注意事项2:
字符集的不同,我们对应可能采取ch-'a',ch-'A',ch-'0',ch这样各种各样的形式提高哈希的准确的*/ const int TOP=1e5,N=TOP+;
const int Z=1e9+;//取模数
const int V=;//字符集哈希数
char s[N],ss[N];
LL v[N];/[x]=V^x%Z
LL u[N];//u[x]=hashvalue(1,x);
LL hashvalue(int l,int r)
{
return (u[r]-u[l-]*v[r-(l-)]%Z+Z)%Z;
}
int main()
{
v[]=;for(int i=;i<=TOP;i++)v[i]=v[i-]*V%Z;
scanf("%s",s+);
LL w=;for(int i=;s[i];i++)w=(w*V+s[i]-'a')%Z;
scanf("%s",ss+);
u[]=;for(int i=;ss[i];i++)u[i]=(u[i-]*V+ss[i]-'a')%Z;
while()
{
int l,r;scanf("%d%d",&l,&r);
LL ww=hashvalue(l,r);
printf("ss[%d,%d]%ss\n",l,r,ww==w?"==":"!=");
}
return ;
}
字符串hash补充(模数情况下)的更多相关文章
- 字符串hash+找模数——cf985F
19260817比自然溢出都要好使 /* 把原串变成用26个01串表示,第i个串对应的字符是i 然后进行字符串hash,s和t双射的条件是26个串的hash值排序后一一相等 */ #include&l ...
- [知识点]字符串Hash
1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...
- 在Linux环境如何在不解压情况下搜索多个zip包中匹配的字符串内容
今天有个生产文件需要查日志,但因为是比较久远的故障,日志已经被归档为zip包放到某个目录下了,在不知道具体日期时间的情况下,总不能一个一个解压搜索吧.于是就研究一下怎么在多个压缩包里搜索字符串了.目前 ...
- teradata 字符串数据合并 在concat()函数无法使用的情况下
在teradata sql中不存在concat()函数或者stuff()函数,在此情况下,如何实现多条字符串数据合并成一行? 在查找不同方法过程中,在stackflow中找到最简便的方法,使用xml_ ...
- CKEditor图片上传问题(默认安装情况下编辑器无法处理图片),通过Base64编码字符串解决
准备做一个文章内容网站,网页编辑器采用CKEditor,第一次用,默认安装情况下,图片无法插入,提示没有定义上传适配器(adapter),错误码提示如下: 根据提示,在官网看到有两种途径:一使用CKE ...
- Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?
一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...
- KMP替代算法——字符串Hash
很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...
- hash进阶:使用字符串hash乱搞的姿势
前言 此文主要介绍hash的各种乱搞方法,hash入门请参照我之前这篇文章 不好意思hash真的可以为所欲为 在开头先放一下题表(其实就是我题解中的hash题目qwq) 查询子串hash值 必备的入门 ...
- 转载:字符串hash总结(hash是一门优雅的暴力!)
转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...
随机推荐
- ELF文件之七——使用链接脚本-2个函数-data-bss-temp-call
main.c int enable; ; int main() { int temp; add(); ; } int add() { ; } o反汇编的地址都是0起始,elf的地址都是映射后的地址. ...
- 小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间
其实新建小程序的时候,会有一个util.js文件,这个文件里已经有时间格式化的方法了,可是它却不能再wxml页面调用, 不过wxml页面是支持引入.wxs文件的,我们重新写一个这样子的工具文件就解决了 ...
- js 递归总结
1.根据子id 递归查找所有父级 id 主要用于vue element 中 Cascader 级联选择器展示 在编辑中回显默认展示 tree 数据 var arr = [{ "label ...
- python爬虫实战:基础爬虫(使用BeautifulSoup4等)
以前学习写爬虫程序时候,我没有系统地学习爬虫最基本的模块框架,只是实现自己的目标而写出来的,最近学习基础的爬虫,但含有完整的结构,大型爬虫含有的基础模块,此项目也有,“麻雀虽小,五脏俱全”,只是没有考 ...
- AndroidStudio修改默认C盘配置文件夹(.android.gradle.AndroidStudio)以及修改后避免踩的坑
场景 AndroidStudio下载安装教程(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103672471 在上 ...
- 「Flink」配置使用Flink调试WebUI
很多时候,我们在IDE中编写Flink代码,我们希望能够查看到Web UI,从而来了解Flink程序的运行情况.按照以下步骤操作即可,亲测有效. 1.添加Maven依赖 <dependency& ...
- export和export default的区别
export和export default的区别一.export的使用1.直接输出export let words = ‘hello world!!!’export function output() ...
- Window 系统 Excel 同时打开两个Excel 文件
问题 我们在使用 Excel 的时候,经常需要打开多个 Excel 文件,但是默认的话我们是只打开一个窗口的.这样不便于我们操作两个 Excel . 解决办法 下载这个补丁进行安装,下载链接 http ...
- 【USACO】JZOJ,Luogu P2690 接苹果 (dp-线性动规)
同步于CSDN:戳这里QAQ 来源:Luogu P2690,JZOJ 题目描述 很少有人知道奶牛爱吃苹果.农夫约翰的农场上有两棵苹果树(编号为 \(1\) 和 \(2\)), 每一棵树上都长满了苹果. ...
- HTML块级、行级元素,特殊字符,嵌套规则
如果介绍HTML网页基本标签的嵌套规则,首先要说的就是元素的分类.元素可以划分为块级元素和行级元素,块级元素是什么?它可以独占一行,可以设置宽高度,默认是100%:行级元素与之相反,它的内容决定它的宽 ...