AcWing 841. 字符串哈希——算法基础课题解

AcWing 841. 字符串哈希

题目描述

给定一个长度为 𝑛 的字符串,再给定 𝑚 个询问,每个询问包含四个整数 𝑙1,𝑟1,𝑙2,𝑟2,请你判断[𝑙1,𝑟1] 和[𝑙2,𝑟2] 这两个区间所包含的字符串子串是否完全相同。

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

输入格式

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

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

接下来 𝑚 行,每行包含四个整数 𝑙1,𝑟1,𝑙2,𝑟2,表示一次询问所涉及的两个区间。

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

输出格式

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

每个结果占一行。

数据范围

1≤𝑛,𝑚≤10^5

输入样例

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

输出样例

Yes
No
Yes

C++

#include <iostream>using namespace std;typedef unsigned long long ULL;const int N = 100010, P = 131;int n, m;
char str[N];
ULL h[N], p[N];// p数组存放幂,h数组表示前缀和哈希值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);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;
}

思路

  • 把字符串看成是一个 P 进制数,每个字符的 ASCII 码对应数的一位
  • ASCII 范围 0 - 127,最少 128 进制,经验上取 131 或 13331 冲突率低
  • 字符串很长,对应的数太大,通过模 2^64 把它映射到 [0, 2^64 - 1]
  • 用 unsigned long long 存储,溢出相当于对 2^64 取模,省略了手动运算
  • 该方法的好处是,可以利用前缀哈希直接求出子串哈希(减去高位)
hash(DEF) = hash(ABCDEF) - hash(ABC) x P^31       2       3       4       5       6A       B       C       D       E       F  1xP^5 + 2xP^4 + 3xP^3 + 4xP^2 + 5xP^1 + 6xP^0D       E       F4xP^2 + 5xP^1 + 6xP^0A       B       C  1xP^2 + 2xP^1 + 3xP^0
  • 不要把某一位映射成 P 进制 0,例如,A 如果是 0,则 AA 也是 0,就会出现冲突
  • \0 的 ASCII 是 0,本题不出现该字符,不用担心上一点
  • 使用这种方法就假定了人品足够好,不出现冲突

Go

package mainimport ("bufio""fmt""os"
)const (N = 100010P = 131
)var (n, m intstr  stringh    [N]uint64p    [N]uint64
)func get(l, r int) uint64 {return h[r] - h[l-1]*p[r-l+1]
}func main() {reader := bufio.NewReader(os.Stdin)fmt.Fscanf(reader, "%d%d\n", &n, &m)str, _ = reader.ReadString('\n')str = " " + str[:len(str)-1] // 加空格使索引从1开始,同时去除末尾的换行符p[0] = 1for i := 1; i <= n; i++ {h[i] = h[i-1]*P + uint64(str[i])p[i] = p[i-1] * P}writer := bufio.NewWriter(os.Stdout)defer writer.Flush()for m > 0 {var l1, r1, l2, r2 intfmt.Fscanf(reader, "%d%d%d%d\n", &l1, &r1, &l2, &r2)if get(l1, r1) == get(l2, r2) {writer.WriteString("Yes\n")} else {writer.WriteString("No\n")}m--}
}

模板

核心思想:将字符串看成P进制数,P的经验值是13113331,取这两个值的冲突概率低
小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果typedef unsigned long long ULL;
ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64// 初始化
p[0] = 1;
for (int i = 1; i <= n; i ++ )
{h[i] = h[i - 1] * P + str[i];p[i] = p[i - 1] * P;
}// 计算子串 str[l ~ r] 的哈希值
ULL get(int l, int r)
{return h[r] - h[l - 1] * p[r - l + 1];
}

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

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

相关文章

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

Java有几种字符串拼接方式,源码如何实现,说一下它们的优缺点

在 Java 中&#xff0c;字符串拼接是一个非常常见的操作&#xff0c;但也是影响性能的一个潜在问题点。Java 提供了以下字符串拼接方式&#xff1a; 使用 运算符 使用 StringBuilder 或 StringBuffer 使用 String.concat() 方法 Java 8 中的 String.join() 和 StringJoiner…

代理IP类型有哪些?定义与区别

您应该对代理有了一定的了解。但是&#xff0c;代理服务器也有不同的类型。就其来源而言&#xff0c;最常见的代理服务器类型是住宅代理和数据中心代理&#xff1a; 1、住宅代理 住宅代理是 ISP 向房主提供的 IP 地址。它是与物理位置关联的真实 IP 地址&#xff0c;因此允许…

WPF中Window的外观实现及常用属性

文章目录 1. 概要2. Window的外观2.1 Window的外观组成2.2 Window的实现2.3 Window外观配置2.4 Window 的其他常用属性1. AllowsTransparency 2. WindowStartupLocation3. ShowInTaskbar4. ShowActivated5. SizeToContent6. Topmost7. WindowStyle 1. 概要 和 Android 类似, W…

小米SU7智能座舱介绍,果然有亮点!

2024 年,小米 SU7 横空出世,从开始的怀疑到发布后仅 24h 就达到了 8W 台的订单量,火到出圈的具象化。智能手机厂家造车,之前的华为做了榜样,小米作为汽车制造中又一条鲶鱼,能否给智能汽车市场带来新的契机? 小米造车可谓是各方位进行全新打造,包括座舱、底盘、智驾、车…

sentaurus节点重排

sentaurus使用时&#xff0c;有时候节点顺序会比较乱&#xff0c;为了方便更好的查看&#xff0c;可以对其进行重新编排&#xff0c;操作方法如下&#xff0c;右键——project——clean up 然后选中chean up 选项中的renumber the Tree&#xff0c;然后点击cleanup操作完成即可…

数据结构:模拟栈

数据结构&#xff1a;模拟栈 题目描述参考代码 题目描述 输入样例 10 push 5 query push 6 pop query pop empty push 4 query empty输出样例 5 5 YES 4 NO参考代码 #include <iostream>using namespace std;const int N 1000010;int m, x; int q[N]; string op; int…

ESP32S3——多线程

一、环境&#xff1a; 平台&#xff1a;arduino IDE 或 VS Code PlatformIO 皆可。 我的是后者&#xff0c;具体为&#xff1a; 框架&#xff1a;VS PlatformIO Arduino 二、硬件准备&#xff1a; 一个esp32s3 本文用到的是U0RXD&#xff08;GPIO44 &#xff09;与U0TXD…

代码随想录算法训练营第22天|二叉树

二叉树part08 235. 二叉搜索树的最近公共祖先 前序&#xff0c;利用二叉搜索的特性 /*** Definition for a binary tree node.* function TreeNode(val) {* this.val val;* this.left this.right null;* }*//*** param {TreeNode} root* param {TreeNode} p* par…

TCP的核心属性

TCP的核心属性 一: TCP的核心属性1.1: 确认应答:1.2 : 超时重传1.3 : 连接管理1.3.1 三次握手1.3.2 四次挥手 1.4 滑动窗口1.5: 流量控制:1.6 拥塞控制1.7 延时应答1.8 :捎带应答1.9: 面向字节流1.10 : 异常情况 一: TCP的核心属性 1.1: 确认应答: 保证可靠性最核心的机制 1…

基于FPGA的数字信号处理:Signed的本质和作用

基于FPGA的数字信号处理中,signed的本质和作用主要体现在对整型变量正负性的定义和运算上。以下是关于signed的详细解释: signed的本质 定义有符号数变量:在FPGA的数字信号处理中,signed关键字用于定义有符号整型变量。这意味着变量可以存储正数和负数,而不仅仅是无符号整…

《web应用技术》第十次作业

将自己的项目改造为基于vue-cli脚手架的项目&#xff0c;页面有导航&#xff0c;学会使用router。 <el-aside width"200px" style"background-color: aliceblue;"> <el-menu :default-openeds"[1]" style"background-color:rgb(1…

邦芒简历:打造你的求职利器

简历&#xff0c;是求职的敲门砖。一份精心制作的简历&#xff0c;能为你赢得宝贵的面试机会。面对求职的激烈竞争&#xff0c;大学生们该如何制作一份出色的简历呢&#xff1f; 一、简洁明了&#xff0c;突出重点 招聘人员通常没有足够的时间去仔细阅读冗长的简历。因此&…

springboot 打成jar部署到Linux环境后读取resources下面的文件

方法代码&#xff1a; ClassLoader loader Thread.currentThread().getContextClassLoader();InputStream flagInputStream loader.getResourceAsStream("static/imagesLogo/imageaaa.png");BufferedImage read;read ImageIO.read(flagInputStream);System.out.pr…

智慧农业灌溉系统的主要工作原理

一、概述   智慧农业灌溉系统是一种基于传感器技术和智能控制技术的灌溉系统。它能够根据土壤湿度、气象条件、作物需水量等多种因素&#xff0c;自动控制灌溉水量和灌溉时间&#xff0c;实现精准灌溉。相比传统的手动灌溉和定时灌溉&#xff0c;智慧农业灌溉系统更加高效、准…

QT error: allocation of incomplete type ‘Ui::Server‘

目录 前言 报错内容&#xff1a; 过程解析&#xff1a; 原因分析&#xff1a; daisy.skye的博客 QT合集http://t.csdnimg.cn/wEVbu 前言 最近又开始需要做上位机了&#xff0c;要知道qt上位机对我来说已经3年没有接触了&#xff0c;最开始接触还是毕业时工作中的简单学习和…

pycharm专业版安装保姆级教程

一、官网下载 PyCharm下载地址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows 选择专业版点击下载 二、进入安装向导 下载完成后&#xff0c;点击.exe文件 点击是 点击下一步 可修改安装目录为自己想安装的位置 或者不修改也可 点击下一步 选择所…

【设计模式】观察者模式(行为型)⭐⭐⭐

文章目录 1.概念1.1 什么是观察者模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了观察者模式4. Spring 哪些地方用到了观察者模式 1.概念 1.1 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在状态改…

【k8s 控制器:ReplicaSet、Deployment、StatefulSet ...】

控制器 ReplicaSet、Deployment、StatefulSet 和 DaemonSet 都是 Kubernetes 中的控制器对象&#xff0c;用于管理 Pod 的创建、扩展、缩减和更新等操作。 一、Deployment 适用无状态服务应用部署&#xff1b;Deployment 是在 ReplicaSet 的基础上提供了更高级功能的控制器。它…

变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

在郭天祥老师视频里有一个问题分享&#xff0c;是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机&#xff0c;最终定位到程序是进入hardfault死机&#xff0c;但暂时没有后续分析了&#xff0c;这里我们来继续分析一下。 死机的程序是这样的&#xff1a; 这段代码…