5.22


字符串hash:

  • 字符哈希串的意思 其实就是将字符串的前缀转换为数来存值由于每位的权值是不一样的 所以每个前缀值都对应着唯一的一种字符串;

  • 主要用途:字符串/数据的比较,是kmp的一种替代;(kmp可以额外计算结点,其余比较相同都可以用字符串hash;很强!


核心思想:通过映射公式将对应的所有字符串转成hash

  • ull get(int l, int r) {
    //ull 是unsigned long long 的替代;
    //h[N]是前面字符的hash值;通过p[N];字符串变成一个p进制数字,体现了字符+顺序,需要确保不同的字符串对应不同的数字
    //由于这个方法会爆int直接用ull可以对爆出的数进行取模运算,另一种角度的hash防冲突
    return h[r] - h[l - 1] * p[r - l + 1];
    }
  •  for (int i = 1; i <= n; i++) {
    //初始化读入的数
    p[i] = p[i - 1] * q;
    //q = 131 或 13331 ,在99%的情况下不会出现冲突
    h[i] = h[i - 1] * q + str[i];
    //初始化字符串前缀和
    }

题目链接:https://www.acwing.com/problem/content/843/


题解:

#include "iostream"
using namespace std;
const int N = 100010, q = 131;
typedef unsigned long long ull;
char str[N];
ull h[N], p[N];
ull get(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1];
}
int main() {
int n, m;
cin >> n >> m;
cin >> str + 1;
p[0] = 1;
//最开始的权值必须赋值为1
for (int i = 1; i <= n; i++) {
//关于这里为什么从1开始,是因为计算前缀和从1开始十分的方便,同时也是为什么读入的时候是str+1;
p[i] = p[i - 1] * q;
h[i] = h[i - 1] * q + 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;
}

磊磊零基础打卡算法:day19 c++字符串hash的更多相关文章

  1. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  2. 【JAVA零基础入门系列】Day6 Java字符串

    字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...

  3. 零基础学C#算法(零基础学算法——C#版)

    今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...

  4. JSon_零基础_006_将JSon格式的字符串转换为Java对象

    需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...

  5. 零基础学Java(4)字符串

    字符串 从概念上讲,Java字符串就是Unicode字符序列.例如,字符串"Java\u2122"由5个Unicode字符J.a.v.a和组成.Java没有内置的字符串类型,而是在 ...

  6. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...

  7. 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础

    ---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...

  8. Android零基础入门第71节:CardView简单实现卡片式布局

    还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...

  9. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  10. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

随机推荐

  1. mybatis-关联查询2-多对一关联查询

    或者多表单独查询方式

  2. linux 使用tc做限速

    #!/bin/bash#针对不同的ip进行限速 #清空原有规则tc qdisc del dev em3 root #创建根序列tc qdisc add dev em3 root handle 1: h ...

  3. docker的使用以及常用命令

    查看docker镜像仓库中是否存在某个镜像,通常第一个或stars最多的就是我们要是使用的,以nginx为例 # 搜索一下是否存在该镜像文件 docker search nginx # 安装使用该镜像 ...

  4. R7-3 十六进制字符串转换成十进制非负整数

    R7-3 十六进制字符串转换成十进制非负整数 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 输入一个以#结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六 ...

  5. centos7.9重启后,主机名会变为IP地址

    现象: centos7.9重启后,主机名会变为IP地址 当关闭DHCP功能,则主机名修改生效,否则重启后,主机名依旧变为图示的IP地址 解决方法:经过排查,由 /etc/sysconfig/netwo ...

  6. java问题解答

    因为子类继承自父类,会沿用父类的东西(没被覆盖的函数以及可见的成员变量等),而这些东西子类是没有的,需要先初始化父类才能被使用 子类构造方法中调用父类构造方法,一个作用是可以给父类构造方法传递实参,给 ...

  7. (读书笔记)基于CMMI的软件工程及实训指导(13-16章)

    软件测试 1.定义: 使用人工或自动的手段来运行或测试某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别. 简单来说,软件测试是为了发现程序中的错误而执行的过程. ...

  8. ABAP 报表的两种下钻功能

    在报表开发中往往会由需求要求跳转,SAP中提供了一些下钻的方式. 这里主要介绍两种 submit 和 call transaction submit 引用的是报表名称,以自开发报表居多 call tr ...

  9. Path Manipulation安全漏洞处理方法

    1 public static String pathManipulation(String path) { 2 HashMap<String, String> map = new Has ...

  10. 逆向学习物联网-网关ESP8266-01硬件原理及平台搭建

    1.系统原理 2.ESP8266网关的内部原理框图 1)STM32通过COM2以AT指令与ESP-01进行通讯,实现MQTT协议, 2)将COM3收到的JSON数据,透明传输到云端 3)通过COM2收 ...