当前位置: 首页 > news >正文

2025.5.17 字符串hash

 输入长度为n的字符串 有m个询问每次有四个参数,l1,r1,l2,r2。求每次[l1,r1]和[l2,r2]所包含的子串是否相等,时的话输出yes,不是no

#include <iostream>
//有很多问题可以用字符串hash 并不一定要用kmp
//字符串hash是一种特殊的hash:字符串前缀hash法
//求hash的时候预处理出来所有前缀的hash 如何定义某一个前缀的hash值:将字符串看成一个p进制的数,每一位字母就表示p进制数字的每一位数字
//转化为数字的话比较大,那么就将前缀代表的数字来mod上一个较小的数字q,那么前缀就被映射到0~q-1上了//注意:不能把某一个字母映射成0
//hash字符串时假定我们人品足够好,不存在冲突(直接不考虑),有个经验值,当p=131/13331,q=pow(2,64)时,在99%的情况下都不会发生冲突
//这样大费周章的算出前缀hash值有什么好处,可以用它计算出任意字串的hash值//给定长度为n的字符串 m次询问,每次有l1,r1,l2,r2,表示一次询问的两个区间,如果两个字串完全相同输出yes,反之
//*p=131/13331,q=pow(2,64)*    这时我们发现q是2^64,当用unsigned long long存储hash值时如果值溢出就会自然mod上2^64,免除手动mod
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数组表示的是预处理的p的多少次方 p是power(指数)的缩写ull get(int l, int r)
{return h[r] - h[l - 1] * p[r - l + 1];
}int main()
{cin >> n >> m >> str + 1;      //注意这里一定是str+1p[0] = 1;for (int i = 1; i <= n; i++)   //预处理p和h{p[i] = p[i - 1] * P;h[i] = h[i - 1] * P + str[i];}while (m--){int l1, r1, l2, r2;cin >> l1 >> r1 >> l2 >> r2;if (get(l1, r1) == get(l2, r2))cout << "yes" << endl;else cout << "no" << endl;}return 0;
}

http://www.xdnf.cn/news/505819.html

相关文章:

  • 如何利用Redis实现延迟队列?
  • 【leetcode】2900. 最长相邻不相等子序列 I
  • 数据库索引优化:如何平衡查询与写入性能
  • 劳特巴赫trace32烧录方法
  • 【Linux网络】ARP协议
  • 使用Pinia持久化插件-persist解决刷新浏览器后数据丢失的问题
  • 使用python进行船舶轨迹跟踪
  • 编译原理7~9
  • 【Element UI】表单及其验证规则详细
  • python运算符
  • python训练营打卡第26天
  • Go语言 Gin框架 使用指南
  • js中不同循环的使用以及结束循环方法
  • 两个电机由同一个控制器控制,其中一个电机发生堵转时,另一个电机的电流会变大,是发生了倒灌现象吗?电流倒灌产生的机理是什么?
  • Gartner《How to Leverage Lakehouse Design in Your DataStrategy》学习心得
  • SAP HCM 0008数据存储逻辑
  • 《棒球万事通》球类运动有哪些项目·棒球1号位
  • c++ 运算符重载
  • 16 C 语言布尔类型与 sizeof 运算符详解:布尔类型的三种声明方式、执行时间、赋值规则
  • qt6 c++操作qtableview和yaml
  • 使用 CodeBuddy 开发一款富交互的屏幕录制与注释分享工具开发纪实
  • C语言查漏补缺
  • Codeforces Round 1024 (Div.2)
  • 【C/C++】C++返回值优化:RVO与NRVO全解析
  • 安全性(三):信息安全的五要素及其含义
  • Python-92:最大乘积区间问题
  • 从AI系统到伦理平台:技术治理的开放转向
  • docker部署第一个Go项目
  • 语音转文字并进行中英文翻译
  • 【JavaScript】 js 基础知识强化复习