AcWing 841. 字符串哈希
. 字符串哈希
一、题目描述
给定一个长度为 的字符串,再给定 个询问,每个询问包含四个整数 ,请你判断 和 这两个区间所包含的字符串子串是否完全相同。
字符串中只包含大小写英文字母和数字。
输入格式
第一行包含整数 和 ,表示字符串长度和询问次数。
第二行包含一个长度为 的字符串,字符串中只包含大小写英文字母和数字。
接下来 行,每行包含四个整数 ,表示一次询问所涉及的两个区间。
注意,字符串的位置从 开始编号。
输出格式
对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes
,否则输出 No
。
每个结果占一行。
数据范围
输入样例:
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
输出样例:
Yes
No
Yes
二、算法思路
字符串哈希
全称 字符串前缀哈希法,把字符串变成一个进制数字(哈希值),实现不同的字符串映射到不同的数字。并且,用记录字符串前个字符的值,类似于前缀和。
作用就是把的时间复杂度降为。比如本题就是对比任意两段内字符串是不是相同,正常就是类似于一个循环长度次的,其实用差就能一步搞定!
举个栗子:
str="ABCABCDEYXCACWING";
h[0]=0;
h[1]="A"的Hash值;
h[2]="AB"的Hash值;
h[3]="ABC"的Hash值;
h[4]="ABCA"的Hash值;
对形如的字符串,采用字符 码乘上次方来计算哈希值。
映射公式:
比如:字符串,
那么
而,
说是
我们想要求""的值,怎么求呢?
就是
注意
-
任意字符不可以映射成,否则会出现不同的字符串都映射成的情况,比如,,皆为
-
冲突问题:通过巧妙设置(或) ,()的值,一般可以理解为不产生冲突(玄学)。
这个取模动作在代码中没有出现过,这是因为采用了,它本身就是,如果超过了这个数字,就直接自动溢出,起到了取模的作用。
问题是比较不同区间的子串是否相同,就转化为对应的哈希值是否相同。
求一个字符串的哈希值就类似于构建一维前缀和,求一个字符串的子串哈希值就相当于一维前缀和应用:
构建: 为前缀和数组,为字符串数组此位置字符对应的码。
应用: 查询之间部分字符串的
三、实现代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int N = 100010;
const int P = 131;
int n, m;
string str;
ULL h[N], p[N];
ULL get(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1];
}
int main() {
cin >> n >> m >> str;
p[0] = 1; // p^0=1,初始化
for (int i = 1; i <= n; i++) {
p[i] = p[i - 1] * P; // 基数
h[i] = h[i - 1] * P + str[i - 1]; // 前缀和
}
while (m--) {
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
if (get(l1, r1) == get(l2, r2))
puts("Yes");
else
puts("No");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2014-09-16 win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!
2014-09-16 Mysql的碎片查看与处理
2013-09-16 linux下vi命令大全
2013-09-16 农安实施的思路