从上一届已经讲了字符串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]=s1
base[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(二)相关推荐

  1. 字符串hash(一)

    很久没遇到过hash的题了,今天来重新温故一下 文章目录 序言 常用的几个字符串hash方法: hash公式(自然溢出) 讲解 模板 单hash 讲解 模板 双hash 讲解 代码 总结 序言 你有没 ...

  2. *【牛客 1 - A】矩阵(字符串hash)

    题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...

  3. 字符串hash——Codeforces533F Encoding

    题面:cf533f 简要题意:有A串和B串,两个串被判为相似的条件是满足在若干(或者没有)二元组 (x, y)表示将串中的所有x换成y,y换成x(x,y代表某个字母)之后,两个串相同.问有多少A的子串 ...

  4. Python基础数据类型之字符串(二)

    Python基础数据类型之字符串(二) 一.字符串的常规操作 二.字符串的大小写转换 1.首字母大写 2. 每个单词首字母大写 3.大写转化为小写 4.所有字母变成大写字母 二.验证码忽略大小写 三. ...

  5. hdu4821 字符串hash

    参考博客:点击打开链接 字符串hash典例. 这里用的是bkdrhash 法.也是最常用的冲突最少的一种.原理:把字符串和数值对应.这里用base=31(一般用质数), 先是扫一遍,处理处每个位子到结 ...

  6. hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))

    题意这英语..反正我是读不懂== 题意:给定一个串,有多少M*L的子串,其中子串的M个子串不相同= (注:某一位不相同即为不相同) 很明显要On的扫,但是似乎前一个与后一个没有关系?是的,前第x个(x ...

  7. 字符串Hash的原理与应用

    字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...

  8. 微信小程序业务-字符串生成二维码(weapp-qrcode)

    微信小程序业务-字符串生成二维码(weapp-qrcode) 前言 邂逅weapp-qrcode 基本使用 详细参数 小程序组件中使用 image属性详解 想使用网络图片? 参考地址 前言 在小程序项 ...

  9. nssl1211-好文章【字符串hash,map】

    正题 题目大意 求长度为n个一个字符串长度为m不同的子串个数 解题思路 用字符串hash判断字符串是否相同,然后时间复杂度O(n2)O(n^2)O(n2),然后我们因为自然溢出所以不能开桶,那就开ma ...

最新文章

  1. 反应器组件 ACE_Reactor
  2. Groovy全攻略--嵌入篇
  3. linux紧急救援模式,如何在 Ubuntu 18.04 中启动到救援模式或紧急模式
  4. 案例分析:FICO如何从VMware迁移到OpenStack
  5. nginx之206异常
  6. HTTP协议(异步和同步)
  7. atitit 需求条目的自动化生成原型html h5界面ui与解决方案
  8. 序章:企业潜规则认知
  9. coj #10066新的开始(最小生成树)
  10. AutoSAR入门到精通讲解 (AppL) 2.1 AutoSAR-CP AppL概述
  11. PX30 Android8.1 红外遥控实现
  12. flask框架----跨域
  13. “21 天好习惯”第一期-4
  14. 解决利用<input type=“file“>上传文件时,value拿到的是fakePath问题
  15. 最新小程序转化app的方法神操作
  16. 全民一起玩Python基础篇第六课:复杂结构初步(列表、对象、模块等)(下)
  17. 【附源码】Python计算机毕业设计农商行贷款管理系统
  18. 六级核心词汇61~100
  19. Failed to load config plugin:vue/essenti al to extend from.
  20. 如何助力银行精准营销

热门文章

  1. 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
  2. 圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...
  3. 朴素贝叶斯--文档分类
  4. mysql如何查询某条记录在分页的第几页_分页插件的使用
  5. jwt的token自动续约_JWT(JSON Web Token)自动延长到期时间
  6. 一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案
  7. mysql目录树_无限级目录树+记忆节点状态(PHP+mysql)
  8. java什么是静态_什么是java静态
  9. mysql 5.6.37 winx64_Mysql 5.6.37 winx64安装双版本mysql笔记记录
  10. 计算机基础知识教案1,计算机基础知识教案一