字母串哈希模板题题解:哈希+前缀和+进制转换+预处理指数函数

news2025/4/6 2:01:37

一、链接

841. 字符串哈希

二、题目

给定一个长度为 nn 的字符串,再给定 mm 个询问每个询问包含四个整数 l1,r1,l2,r2l1,r1,l2,r2,请你判断 [l1,r1][l1,r1] 和 [l2,r2][l2,r2] 这两个区间所包含的字符串子串是否完全相同

字符串中只包含大小写英文字母和数字

输入格式

第一行包含整数 nn 和 mm,表示字符串长度和询问次数。

第二行包含一个长度为 nn 的字符串,字符串中只包含大小写英文字母和数字。

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

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

输出格式

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

每个结果占一行。

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:

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

输出样例:

Yes
No
Yes
难度:简单
时/空限制:1s / 64MB
总通过数:51709
总尝试数:78284
来源:模板题
算法标签

三、题意

输入一个字符串,输入两个区间,判断这两个区间是否完全相等

四、代码

#include<iostream>

using namespace std;

typedef unsigned long long ULL;

const int N=1e5+10,P=131;

ULL h[N],p[N];
char str[N];

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

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    scanf("%s",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))  printf("Yes\n");
        else    printf("No\n");
    }
    
    return 0;
}

五、总结

1.把字符串看成是数字,每一个字符看成是数位上的一个数字,把字符串子串看成是P进制的数字,先把P进制的数字转换成10进制的数字,然后对2^64取模,2^64是经验值P=131也是经验值,如果数据超过unsigned long long相当于对2^64取模,所以定义为unsigned long long就不需要进行单独的取模运算

2.typedef的使用,是把一个比较长的api 自定义一个比较简略的方式,比如这样:

typedef unsigned long long ULL;

3.考虑到前缀和类似思想,数组下标从1开始使用,前缀和:前缀和 795. 前缀和,还有另一方面的考虑,假设一个字符a是0,那么aa按照进制转换也是0,但是实际上a和aa从字符串上来讲是不一样的两个字符串,从数字的角度来说是相等的,但是按照题目要求是不相等的

4.把字符串当作是P进制数来进行计算是这一行代码

h[i]=h[i-1]*P+str[i];

5.预处理指数函数,求出以P为底的指数函数的数值

p[i]=p[i-1]*P;

注意p[0]=1,需要进行初始化,不然无法进行上述计算 

 6.定义一个函数,输入两个区间端点,返回一个数值,比较这两个数值可以得出答案,这个函数的具体实现是:类似于前缀和的公式

h[r]-h[l-1]*p[r-l+1];

 可以理解为一个字符串,右边的是abcde,左边的是abc,现在两个字符串都被预处理成为十进制的数字了,需要把数字移到对齐,也就是用abc放在abcde正下方,列减法竖式的那种情况,P进制最右边是P^0,往左依次是p^1,p^2,p^3......到最左边是p^(r-1),h[l-1]的最左边是p^(l-1-1),把他们移动到同一位,相当于在h[l-1]后面加上零,使得两个字符串对齐,abcde-abc00,大概是这种感觉,(r-1)-(l-1-1)==r-l+1,从而可以推出上述式子,其实最好的方法是熟练应用这个公式

7.代码细节,输入从1开始计数的字符串

scanf("%s",str+1);

六、精美图片

 

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

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

相关文章

UEFI build报错:‘build‘ is not recognized as an internal or external command

UEFI学习&#xff0c;某一次进行build时&#xff0c;提示&#xff1a; build is not recognized as an internal or external command,operable program or batch file. 用的命令是&#xff1a; C:\UEFIWorkspace>build -a X64 -p edk2\OvmfPkg\OvmfPkgX64.dsc -b NOOPT -…

k8s学习day03

第五章 Pod详解 本章节将详细介绍Pod资源的各种配置&#xff08;yaml&#xff09;和原理。 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个…

【Python学习】Python大版本新增内容精选

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

MQ百万级数据堆积如何处理

问题分析 如果&#xff0c;如果哈&#xff0c;RabbitMQ或者是kafka&#xff0c;这些消息队列出现大量的数据堆积&#xff0c;乃至是成千上万&#xff0c;我们作为一个开发工程师或者是架构师&#xff0c;我们如何去解决这种突发情况呢&#xff1f;可能大家会想&#xff0c;怎么…

面试题更新之-this指向问题

文章目录 this指向是什么常见情况下 this 的指向怎么修改this的指向 this指向是什么 JavaScript 中的 this 关键字用于引用当前执行代码的对象。它的指向是动态的&#xff0c;根据执行上下文的不同而变化。 常见情况下 this 的指向 全局作用域中的 this&#xff1a; 在全局作…

【游戏客户端】制作你玩我猜Like玩法

【游戏客户端】制作你玩我猜Like玩法 大家好&#xff0c;我是Lampard猿奋~~ “你画我猜”相信大家都不陌生&#xff0c;当初这款小游戏可谓茶余饭后必玩之选&#xff0c;风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…

图像预处理——CV

目录 1.图像预处理 1.1 图像显示与存储原理 1.2 图像增强的目标 1.3 点运算&#xff1a;基于直方图的对比度增强 1.4 形态学处理 1.5 空间域处理&#xff1a;卷积 1.6 卷积的应用&#xff08;平滑、边缘检测、锐化等&#xff09; 1.7 频率域处理&#xff1a;傅里叶变换…

Seata - 入门笔记

1、事务 访问并可能更新数据库中数据库中各种数据线的一个程序执行单元 原子性&#xff1a;事务是一个不可分割的工作单位&#xff0c;一个事务要么都做要么都不做 一致性&#xff1a;必须是使数据库从一个一致性到另一个一致性的状态&#xff0c;中间状态不能被观察到 隔离…

Python爬虫在电商数据挖掘中的应用

作为一名长期扎根在爬虫行业的专业的技术员&#xff0c;我今天要和大家分享一些有关Python爬虫在电商数据挖掘中的应用与案例分析。在如今数字化的时代&#xff0c;电商数据蕴含着丰富的信息&#xff0c;通过使用爬虫技术&#xff0c;我们可以轻松获取电商网站上的产品信息、用…

明年,HarmonyOS不再兼容Android应用!

2023年华为开发者大会&#xff0c;不知道各位老铁们是否观看了&#xff0c;一个震撼的消息就是&#xff0c;首次公开了HarmonyOS NEXT的概念&#xff0c;简而言之就是&#xff0c;这是一款专为开发者打造的预览版操作系统&#xff0c;旨在提供"纯正鸿蒙操作系统"的体…

2023年果粉装机必备软件有哪些?Macbook电脑需要安装什么软件

作为一名从Windows全面切换到Mac的果粉&#xff0c;在一开始的时候确实感到诸多不便&#xff0c;比如文件管理器操作别扭&#xff0c;鼠标移动不够跟手等等。 后来才发现&#xff0c;除了游戏&#xff0c;大多数问题都能用软件来解决。Mac虽然小众&#xff0c;但是用户群体有很…

84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最…

林【2018】

关键字: BST插入叶子结点、ADT结伴操作、队列插入前r-1、哈希函数二次探测法(1,-1,4,-4)、队列元素个数、折半查找失败次数、广义表链表结构、B-树构建、单链表指定位置插入数组元素 一、判断 二、单选 h(49)+1,-1,+4,-4

什么是动态测试?

作为一名测试人员&#xff0c;要对各种测试方法了然于胸&#xff0c;今天这篇文章就来介绍下什么是动态测试。采用动静结合的测试方式&#xff0c;挖掘出程序中存在的问题&#xff0c;以更好地保证测试质量。同时&#xff0c;我也准备了一份软件测试视频教程&#xff0c;放在文…

水壶问题(力扣)数学 JAVA

有两个水壶&#xff0c;容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。 如果可以得到 targetCapacity 升水&#xff0c;最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。 你可以&…

echarts 横向柱状图

<template><div ref"chart" style"height: 100%"></div> </template><script> import * as echarts from "echarts"; var cate ["质量通病1", "质量通病2", "质量通病3", "质…

LeetCode 热题 100 JavaScript--160. 相交链表

/*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//*** param {ListNode} headA* param {ListNode} headB* return {ListNode}*/// 1、暴力解法 var getIntersectionNode function(headA, headB) {var p1 …

大英博物馆将世界历史带入 The Sandbox 元宇宙

又一个知名的、历史领域合作伙伴加入了我们的元宇宙生态系统&#xff01; 大英博物馆选择 The Sandbox 作为其首次进入元宇宙的合作平台。通过这次合作&#xff0c;我们的用户将能够通过全新的沉浸式体验来探索全球历史。 以下是您需要了解的一切&#xff01; 我们正在与大英…

测试工程师如何利用AIGC高效工作?Chat PDF辅助我们写测试用例和脚本

ChatPDF 是一种基于人工智能的工具&#xff0c;用于将 PDF 文档转换为可交互式的聊天式界面。它能够将静态的 PDF 文件转化为动态的聊天对话框&#xff0c;使用户可以通过对话的形式与文档进行交互。 ChatPDF 可以完成以下工作&#xff1a; 1. 将 PDF 文档转换为聊天式界面&am…