【基础算法】字符串哈希

news2025/7/16 0:40:35

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

文章目录

  • 前言
  • 字符串前缀哈希法:
    • 核心思想:
      • 如何定义某一个前缀的哈希值?(将字符串转换为数字)
        • 1.不可以映射成0:
        • 2.会存在冲突:
    • 好处:利用前面算的前缀哈希可以求出任意一段的子串的哈希值。
    • 例题:
      • 题目:
      • 输入格式
      • 输出格式
      • 数据范围
      • 输入样例:
      • 输出样例:
    • 代码:
    • 代码解析:
  • 最后


前言

今天这篇文章讲解的是哈希的另一种题型:字符串前缀哈希法,希望我的讲解你可以喜欢,谢谢。
——————————————————————————————

首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
1.把时间分给睡眠,分给书籍,分给运动,分给花鸟树木和山川湖海,分给你对这个世界的热爱,而不是将自已浪费在无聊的人和事上。当你开始做时间的主人,你会感受到平淡生活中喷涌而出的平静的力量,至于那些焦虑与不安,自然烟消云散。

2.毕淑敏说过:在光芒万丈之前,我们都要欣然接受眼下的难堪和不易,接受一个人的孤独和偶尔的无助,认真做好眼前的每件事,你想要的都会有。你要知道,所有的逆袭都是有备而来。
所以,请你一定要站在自己所热爱的世界里,闪闪发光。这归途尚远,要迷人,且倔强。

3.人生的际遇,不是等来的,而是拼出来的。是自律的汗水,也是前行的坚韧。当你付出了足够的努力、积攒了足够的实力,自会拨开人生的迷雾,收获属于自己的精彩。

4.有段话讲得很好:刷一宿视频是我的人性,但刷完视频后的空虚感和对浪费时间的悔恨也是我的人性。胡吃海喝是我的人性,但身材走形看着镜子里发胖的自己,心里难受也是我的人性。所谓延迟满足,重点不在延迟,而在于满足。压抑当下的小人性,是为了成就未来的大格局。自律的人,只不过比放纵的人看得远了一点而己。

5.自律不是表演给自己或者其他人看的,它需要强大的内心动力,紧盯着未来那个宏大的目标,眼下这点小约束就会变得微不足道。生活里真正的强者,是即使怀揣着痛苦和悲伤,也能热爱生活的人,也是靠着某个信念抵挡住外界的诱惑,仍旧努力做好每件事的人。

字符串前缀哈希法:

核心思想:

字符串前缀哈希法是一种比较特殊的哈希方法,它是先预处理出所有字符串前缀的哈希,利用哈希数组进行存储,下标是0开始的,h[0]是等于0的。
例如:
字符串“abcabcde”
h[0]=0;
h[1]="a"的hash(哈希)值;
h[2]="ab"的hash值;
h[3]="abc"的hash值;
……

如何定义某一个前缀的哈希值?(将字符串转换为数字)

将字符串看成P进制的数,然后将P进制的数转换为十进制的数字:
在这里插入图片描述
这样转换成十进制的数字,可能非常大,因为字符串可能有10到20个,这转换后就是很大很大的数字,容易溢出和出现错误,因此可以对Q进行取模,使其映射到【0,Q-1】;

1.不可以映射成0:

如:
a----------0;
aa--------00,
这样就不对了,两个不同的字符串映射成一样的结果,造成冲突

2.会存在冲突:

将P和Q设定的非常好,就可以极大概率避免冲突(99.999%):
P=131or13331
Q=264;
这里取Q=264,这里可以直接定义哈希数组为unsigned long long ,它会使超过264的数溢出,溢出的值就等价于对264取模。

好处:利用前面算的前缀哈希可以求出任意一段的子串的哈希值。

在这里插入图片描述
如图上面的这个图:
我们已知:h[R]和h[L-1]的哈希值,怎么求出L到R的哈希值?
在这里插入图片描述
上面我们不是假设了字符串为以P为进制的数字,则右边是高位,左边是低位,
h[i]=h[i−1]×P+hash(s[i]);
故hash(s[l…r])=h[r]−h[l−1]×Pr−l+1;

例题:

题目:

给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1]
和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。

输入格式

第一行包含整数 n 和 m,表示字符串长度和询问次数。
第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。

接下来 m 行,每行包含四个整数 l1,r1,l2,r2,表示一次询问所涉及的两个区间。

注意,字符串的位置从 1 开始编号。

输出格式

对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes,否则输出 No。

每个结果占一行。

数据范围

1≤n,m≤105

输入样例:

8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2

输出样例:

Yes
No
Yes

代码:

#include <iostream>
#include <algorithm>

using namespace std;

typedef unsigned long long ULL;//将P和Q设定的非常好,就可以极大概率避免冲突(99.999%):
                               //P=131or13331
const int N = 100010, P = 131; //Q=2^64^;
                               //这里取Q=2^64^,这里可以直接定义哈希数组为unsigned long long ,
                               //它会使超过2^64^的数溢出,溢出的值就等价于对2^64^取模。
int n, m;
char str[N];
ULL h[N], p[N];//p[N]是存放要乘以p的多次方

ULL get(int l, int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}

int main()
{
    scanf("%d%d", &n, &m);
    scanf("%s", str + 1);//因为如果直接用 scanf("%s",str); 的话,就会出现一个问题:
                         //scanf函数遇到空格或TAB,就会停下来。所以用指针的方式就可以防止这种情况发生。
                        //输入str第一个元素之后的字符串,给str[1]赋值
    p[0] = 1;
    for (int i = 1; i <= n; i ++ )
    {
        h[i] = h[i - 1] * P + str[i];
        p[i] = p[i - 1] * P;
    }

    while (m -- )
    {
        int l1, r1, l2, r2;
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);

        if (get(l1, r1) == get(l2, r2)) puts("Yes");
        else puts("No");
    }

    return 0;
}

代码解析:

1.解决冲突:

typedef unsigned long long ULL;//将P和Q设定的非常好,就可以极大概率避免冲突(99.999%):
                               //P=131or13331
const int N = 100010, P = 131; //Q=2^64^;
                               //这里取Q=2^64^,这里可以直接定义哈希数组为unsigned long long ,
                               //它会使超过2^64^的数溢出,溢出的值就等价于对2^64^取模。
int n, m;
char str[N];
ULL h[N], p[N];//p[N]是存放要乘以p的多次方

2.scanf(“%s”, str + 1);

 scanf("%s", str + 1);//因为如果直接用 scanf("%s",str); 的话,就会出现一个问题:
                         //scanf函数遇到空格或TAB,就会停下来。所以用指针的方式就可以防止这种情况发生。
                        //输入str第一个元素之后的字符串,给str[1]赋值

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.莫言在《晚熟的人》当中说:真正的强大不是忘记,而是接受接受分道扬镳,接受世事无常,接受孤独挫败,接受突如其来的无力感,接受自己的不完美,接受困惑、不安、焦虑和遗憾,调整自己的状态,找到继续前行的力量,成为更好的自己。是的,与其苦苦的想忘记,不如坦然接受。

2.接受你最闪耀的时候,不骄傲;接受你最糟糕的时候,不气馁;接受你最平淡无奇的时候,不放弃。正如王朔对女儿说的:内心强大到混蛋,比什么都重要。

3.三毛曾说过:“给自己时间,不要焦急,一步一步来,一日一日过,请相信生命的韧性是惊人的,跟自己的心去合作,不要放弃对自己的爱护。

4.当你的能力还驾驭不了你的目标时,你就应该沉下心来历练。祛除杂念,不好高骛远,也不轻言放弃。信手拈来的从容都是厚积薄发的沉淀,找到一个准确的定位,认真打磨自己,慢慢就能变得波澜不惊,在喧嚣中宁静致远。但愿你心安,向内探求不停,做有心的蓄积者,沉淀自己,升华自己。

5.有心栽花花不开,无心插柳柳成荫。生活有时候很有意思,你越是用力证明,越感觉疲惫。越是对一件事的结果产生执念,就越反着来。太过用力,本身就是一种消耗,反而适得其反,用温柔的力量,反而能厚积薄发,就像发条上的太紧容易断,该放松时放松,该努力时努力,张弛有度才刚刚好。不骄不躁,抚平心态,才能看到更好的阳光。不要一味地追求太紧绷的用力,人生最坏的结果不过是大器晚成。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逆风翻盘拿下感知实习offer,机会总是留给有准备的人

个人背景211本&#xff0c;985硕&#xff0c;本科是计算机科学与技术专业&#xff0c;研究生是自学计算机视觉方向&#xff0c;本科主要做C和python程序设计开发&#xff0c;java安卓开发&#xff0c;研究生主要做目标检测&#xff0c;现在在入门目标跟踪和3d目标检测。无论文&…

区分效度全流程分析

基本说明 区分效度&#xff08;又称判别效度、区别效度&#xff09;&#xff0c;其实质也是一种结构效度。区分效度强调本不应该在同一因子的测量项&#xff0c;确实不在同一因子下面。比如说&#xff0c;测量项A和 B分别测量两个属性&#xff0c;应该分属于因子A和因子B中&…

正交实验与极差分析

正交试验极差分析流程如下图&#xff1a; 正交试验说明 正交试验是研究多因素试验的设计方法。对于多因素、多水平的实验要求&#xff0c;如果每个因素的每个水平都要进行试验&#xff0c;这样就会耗费大量的人力和时间&#xff0c;正交试验可以选择出具有代表性的少数试验进行…

【Java基础 下】 027 -- 异常、File、综合案例

目录 一、异常 1、异常的分类 ①、Error ②、Exception ③、小结 2、编译时异常和运行时异常 ①、编译时异常 ②、运行时异常 ③、为什么异常要分成编译时异常和运行时异常&#xff1f; ④、小结&#xff08;运行时异常和编译时异常的区别&#xff09; 3、异常的作用 ①、查看b…

百万数据excel导出功能如何实现?

最近我做过一个MySQL百万级别数据的excel导出功能&#xff0c;已经正常上线使用了。 这个功能挺有意思的&#xff0c;里面需要注意的细节还真不少&#xff0c;现在拿出来跟大家分享一下&#xff0c;希望对你会有所帮助。 原始需求&#xff1a;用户在UI界面上点击全部导出按钮…

基于Java的浏览器的设计与实现毕业设计

技术&#xff1a;Java等摘要&#xff1a;当今世界是一个以计算机网络为核心的信息时代&#xff0c;互联网为人们快速获取、发布和传递信息提供了便捷&#xff0c;而浏览器作为互联网上查找信息的重要工具&#xff0c;给人们提供了巨大而又宝贵的信息财富&#xff0c;受到了大家…

苹果ios签名证书的生成方法

在使用hbuilderx打包uniapp或html5应用的时候&#xff0c;假如是打包ios应用&#xff0c;是需要ios签名证书&#xff0c;和证书profile文件的&#xff0c;这个证书要求是p12格式的证书&#xff0c;profile文件又叫描述文件。 这两个文件&#xff0c;需要在苹果开发者中心生成&…

利用关联来发现复杂攻击模式

日志是网络活动的重要依据&#xff0c;包含了关于您网络上所有用户和系统活动的详尽信息。基本日志分析可帮助您轻松地对数百万个日志进行分类&#xff0c;并挑选出可以表明存在可疑活动的日志&#xff0c;识别与正常网络活动不符的异常日志。通常&#xff0c;单独查看某个日志…

WindowsPowerShell 停止、启动、暂停和重启服务、卸载服务

PowerShell 停止、启动、暂停和重启服务、卸载服务 PowerShell 停止、启动、暂停和重启服务 官文 powershell卸载服务 官文 目录PowerShell 停止、启动、暂停和重启服务、卸载服务停止、启动、暂停和重启停止服务启动服务暂停服务重启服务卸载移除服务停止、启动、暂停、重启…

WIFI 安全总论

一、总体逻辑安全策略认证机制 加密机制为了增强无线网络安全性&#xff0c;至少需要提供认证和加密两个安全机制&#xff1a;1、 认证机制&#xff1a;认证机制用来对用户的身份进行验证&#xff0c;以限定特定的用户&#xff08;授权的用户&#xff09;可以使用网络资源。2、…

VBS带你领略脚本语言的快乐!(实战篇—刷字数)

用VBS脚本刷爆搜狗输入法 前言 偶然一次打开了搜狗输入法的个人主页&#xff0c;看到这135万字&#xff0c;不禁想起当年高中时为了跟同学装逼&#xff0c;上课挂脚本刷字数的“光荣战绩”&#xff0c;很快啊&#xff0c;我就在古老的硬盘中找到了它&#xff0c;以我如今的智慧…

Tesseract-OCR命令及WPF简单使用

Tesseract 是一个开源的 OCR 引擎&#xff0c;可以识别多种格式的图像文件并将其转换成文本&#xff0c;最初由 HP 公司开发&#xff0c;后来由 Google 维护。 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 其中文件名中带有 dev 的为开发版本&#xff0…

无广告的视频二维码生成教程(组图介绍)

如今&#xff0c;二维码的应用越来越广了&#xff0c;也非常方便&#xff0c;那么如何把视频转换生成二维码呢&#xff1f;网页地址转换二维码的工具很多&#xff0c;但视频转换二维码的工具&#xff0c;可就比较少了&#xff0c;今天来教教大家如何实现。 应用场景及需求&…

JavaScript 测试 jQuery

文章目录JavaScript 测试 jQuery引用 jQueryjQuery 描述javascript 方式测试 jQueryJavaScript 测试 jQuery 测试 JavaScript 框架库 - jQuery 引用 jQuery 如需测试 JavaScript 库&#xff0c;您需要在网页中引用它。 为了引用某个库&#xff0c;请使用 <!DOCTYPE html…

史上最详细的小程序测试用例模板,以后再也不怕测试用例不会写了

目录 1. 文档介绍 1.1 文档目的 1.2 文档范围 1.3 读者对象 1.4 术语与缩写解释 2. 功能测试用例 2.1 被测试对象的介绍 2.2 测试范围与目的 2.3 测试环境与测试辅助工具的描述 2.4 功能测试用例 附录&#xff1a;评审意见 1. 文档介绍 1.1 文档目的 设计测试用例…

Mybatis-plus 分页集成以及基本使用总结 入门和案例 注解连表查询分页案例等

简介 Mybaits-plus 是mybits 的升级版&#xff0c;从mybaits 升级到mybaits-plus 可以实现平滑升级 Mybaits-plus 本身提供了大量的基本查询方法以及强大的 Wrapper(包装) 类 用于查询的 QueryWrapper 以及 更新的 UpdateWrapper &#xff0c;使用Wrapper 基本已经可以构建大…

记忆总掉线?这些行为太伤脑!

人体老化过程中&#xff0c;记忆力的衰退不可避免&#xff0c;这种属于“良性”的记忆衰退。但非“良性”的记忆衰退可要重视&#xff0c;很可能是痴呆症的早期征兆。由于各种原因&#xff0c;我们各种熬夜。作息的不规律扰乱大脑神经系统的调节。这种长期慢性损害大脑&#xf…

ur3+robotiq 2f 140配置moveit

ur3robotiq 2f 140配置moveit 参考链接1 参考链接2 官方配置movit教程 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪…

人工智能AI威武,爱也……恨也……

人工智能AI威武&#xff0c;爱也&#xff01;恨也&#xff01;&#xff01;它会创作会代码&#xff0c;从它那儿能仿到更好的思维&#xff1b;多它那里可以学到更好的代码。它聪慧全能&#xff0c;成为一坨人偷懒神器&#xff1b;变成“智者”作弊的“倚天屠龙”&#xff01;&a…

易基因|DNA甲基化研究的测序数据挖掘思路:干货分享

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。总体来说&#xff0c;DNA甲基化一般遵循三个步骤进行数据挖掘。首先&#xff0c;进行整体全基因组甲基化变化的分析&#xff0c;包括平均甲基化水平变化、甲基化水平分布变化、降维分析、聚…