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

字符串哈希(算法题)

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;/* 使用unsigned long long类型存储哈希值,利用自然溢出实现自动取模 */
typedef unsigned long long ULL;
const int N = 100010;        // 最大字符串长度
const int base = 133;        // 哈希进制基数,选择质数减少碰撞概率
ULL p[N];                    // 存储base的幂次 p[i] = base^i
ULL h[N];                    // 前缀哈希数组 h[i]表示前i个字符的哈希值/* 计算子串[l,r]的哈希值(1-based下标) */
ULL get(int l, int r) {/* 公式推导:h[r] = h[l-1] * base^(r-l+1) + hash(s[l..r])因此子串哈希 = h[r] - h[l-1] * p[r-l+1] */return h[r] - h[l - 1] * p[r - l + 1];
}int main() {int n, m;cin >> n >> m;           // 输入字符串长度n和查询次数mstring x;cin >> x;                // 输入目标字符串/* 初始化哈希数组 */p[0] = 1;                // base^0 = 1for (int i = 1; i <= n; i++) {/* 示例:当i=1时,h[1] = h[0]*base + s[0]的ASCII码值假设x = "abc",则:h[1] = 0 * 133 + ('a'-'a'+1) = 1h[2] = 1 * 133 + ('b'-'a'+1) = 133 + 2 = 135h[3] = 135 * 133 + 3 = 17955 + 3 = 17958 */h[i] = h[i - 1] * base + (x[i - 1] - 'a' + 1);  // 字符串0-based转1-based/* 计算base的幂次:p[1] = base^1 = 133p[2] = base^2 = 133 * 133 = 17689 */p[i] = p[i - 1] * base;}/* 处理m个查询 */while (m--) {int l1, r1, l2, r2;cin >> l1 >> r1 >> l2 >> r2;/* 哈希比较过程示例:假设查询子串[1,2]和[3,4]1. 检查长度是否相同:r1-l1+1 == r2-l2+12. 计算哈希值:hash1 = h[2] - h[0] * p[2]hash2 = h[4] - h[2] * p[2]3. 若hash1 == hash2则认为相同(注意存在极小概率哈希碰撞) */if (get(l1, r1) == get(l2, r2)) {cout << "Yes" << endl;} else {cout << "No" << endl;}}return 0;
}

此篇参考了acwing算法基础课。

相关文章:

  • 单片机-STM32部分:8、外部中断
  • 极简远程革命:打破公网桎梏,重塑数字生活新体验
  • Java常用API:深度解析与实践应用
  • React知识框架
  • 用kompose将docker-compose文件转换为K8S资源清单
  • Linux下使用openssh搭建sftp服务
  • A. Row GCD(gcd的基本性质)
  • Linux Shell编程和循环语句
  • Sui Basecamp 2025 全栈出击
  • Spring 是什么?它解决了什么问题?
  • Django之账号登录及权限管理
  • GrassRoot备份项目
  • uniapp项目打包的微信小程序,设置uni-popup type=“bottom“时,底部有空隙
  • Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!
  • Amazon Redshift 使用场景解析与最佳实践
  • 全连接神经网络学习笔记
  • 学习黑客什么是 ARP
  • AutoGen 框架解析:微软开源的多人 Agent 协作新范式
  • 每日学习:DAY24
  • Spring AI 入门(持续更新)
  • 夜读丨古代有没有近视眼?
  • 巴基斯坦信德省卡拉奇发生爆炸
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • 上海明后天将迎强风大雨,陆地最大阵风7~9级
  • 习近平致电祝贺默茨当选德国联邦总理
  • 马克思主义理论研究教学名师系列访谈|石书臣:思政课是落实立德树人的关键