字符串模板,在模数意义下的,比较好用

 #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补充(模数情况下)的更多相关文章

  1. 字符串hash+找模数——cf985F

    19260817比自然溢出都要好使 /* 把原串变成用26个01串表示,第i个串对应的字符是i 然后进行字符串hash,s和t双射的条件是26个串的hash值排序后一一相等 */ #include&l ...

  2. [知识点]字符串Hash

    1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...

  3. 在Linux环境如何在不解压情况下搜索多个zip包中匹配的字符串内容

    今天有个生产文件需要查日志,但因为是比较久远的故障,日志已经被归档为zip包放到某个目录下了,在不知道具体日期时间的情况下,总不能一个一个解压搜索吧.于是就研究一下怎么在多个压缩包里搜索字符串了.目前 ...

  4. teradata 字符串数据合并 在concat()函数无法使用的情况下

    在teradata sql中不存在concat()函数或者stuff()函数,在此情况下,如何实现多条字符串数据合并成一行? 在查找不同方法过程中,在stackflow中找到最简便的方法,使用xml_ ...

  5. CKEditor图片上传问题(默认安装情况下编辑器无法处理图片),通过Base64编码字符串解决

    准备做一个文章内容网站,网页编辑器采用CKEditor,第一次用,默认安装情况下,图片无法插入,提示没有定义上传适配器(adapter),错误码提示如下: 根据提示,在官网看到有两种途径:一使用CKE ...

  6. Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?

    一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...

  7. KMP替代算法——字符串Hash

    很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...

  8. hash进阶:使用字符串hash乱搞的姿势

    前言 此文主要介绍hash的各种乱搞方法,hash入门请参照我之前这篇文章 不好意思hash真的可以为所欲为 在开头先放一下题表(其实就是我题解中的hash题目qwq) 查询子串hash值 必备的入门 ...

  9. 转载:字符串hash总结(hash是一门优雅的暴力!)

    转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...

随机推荐

  1. java 获取两个时间之前所有的日期

    正序(2017-01-01 ~2019-xxxxx) package com.founder.util; import java.text.SimpleDateFormat; import java. ...

  2. lwip 2.0.2 snmp mib ipv6

    1.3.6.1.2.1 - SNMP MIB-2 Submitted by Harald.T.Alvestrand at uninett.no from host aun.uninett.no (12 ...

  3. Linux 查看CPU、内存、机器型号等硬件信息

    # 查看CPU信息 #查看CPU信息(型号) [root@localhost ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 32 ...

  4. Linux 邮件服务

    三个要点 1.smtp协议 2.搭建本地邮件服务器 3.使用外部邮件服务器 实现邮件功能 1.smtp协议           SMTP(Simple Mail Transfer Protocol)即 ...

  5. Angular路由使用

    一. 路由:根据不同URL地址,动态让根组件挂载其他组件来实现单页面应用,相对地址 1. 项目一开始创建就会询问是否添加路由(Angular routing) 2. 有无路由区别{ 1. 多了一个ro ...

  6. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理

    源码地址:GitHub·点这里||GitEE·点这里 一.阿里微服务简介 1.基础描述 Alibaba-Cloud致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开 ...

  7. springBoot2.x启动项目报java.sql.SQLNonTransientConnectionException

    将项目从springBoot1.x升级到springBoot2.x,启动报错: java.sql.SQLNonTransientConnectionException: Cannot load con ...

  8. 异常 lock buffer failed for format 0x23

    02-11 21:21:45.669625 14804 14815 W Monkey : // java.lang.RuntimeException: lock buffer failed for f ...

  9. hadoop3自学入门笔记(3)-java 操作hdfs

    1.core-site.xml <configuration> <property> <name>fs.defaultFS</name> <val ...

  10. Mac下升级ruby至最新版本

    Mac自身的ruby 版本 2.x,通过ruby -v可以查看版本号. 为更新到ruby的最新版本,可通过以下命令解决: brew update brew install ruby 执行完命令后,ru ...