当前位置: 首页 > 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算法基础课。

http://www.dtcms.com/a/178840.html

相关文章:

  • 单片机-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 入门(持续更新)
  • 深入解析建造者模式(Builder Pattern)——以Java实现复杂对象构建的艺术
  • 支持鸿蒙next的uts插件
  • 计算机学习路线与编程语言选择(信息差)
  • LLaMA模型本地部署全攻略:从零搭建私有化AI助手
  • 突破网络限制:Windows平台离线搭建Linux环境+Docker化部署AI知识库RAGFlow实战
  • 平板收银系统、国产系统,鸿蒙系统,小键盘的封装与应用—仙盟创梦IDE
  • Matlab 数控车床进给系统的建模与仿真
  • Java执行linux服务器本地命令
  • HTTP Error 500.31 - Failed to load ASP.NET Core runtime
  • 第三节第一部分:Static修饰类变量、成员变量