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

字符串哈希(算法题)

在这里插入图片描述

#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.xdnf.cn/news/4778.html

相关文章:

  • VR 南锣鼓巷:古老街区的数字化绘卷与沉浸式遨游​
  • 高处安装、维护拆除作业考试重点知识
  • PlatformIO
  • 遗传算法求解异构车队VRPTW问题
  • 基于Credit的流量控制
  • SQL知识点总结
  • 【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)
  • 第一次被AI指点出文章的问题
  • 【AXI总线专题】-AXI-LITE总线解读
  • 307.重新格式化电话号码
  • MySQL中MVCC的实现原理
  • WarpDemuX
  • AI开发跃迁指南(第三章:第四维度1——Milvus、weaviate、redis等向量数据库介绍及对比选型)
  • docker镜像误删恢复
  • 网络字节序 - 大端
  • 三格电子—ProfiNet 转 CAN/CANopen 网关应用案例
  • pygame联网飞机大战游戏实现
  • Ubuntu18.04 设置开机服务自启
  • 蓝桥杯FPGA赛道积分赛
  • 【愚公系列】《Manus极简入门》026-市场分析专家:“市场洞察家”
  • Centos系统详解架构详解
  • 深度学习工程化:基于TensorFlow的模型部署全流程详解
  • 力扣刷题Day 42:缺失的第一个正数(238)
  • Linux防火墙
  • DVWA保姆级通关教程--05文件上传
  • LeetCode 热题 100 131. 分割回文串
  • 对 Kotlin 中的 data 关键字的理解,相比于普通类有哪些特点?
  • 在浏览器使用 MCP,纯边缘函数实现 MCP Client Server
  • 软考错题(三)
  • JavaSE核心知识点02面向对象编程02-01(类与对象)