磊磊零基础打卡算法:day19 c++字符串hash
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的更多相关文章
- 零基础学Java第四节(字符串相关类)
本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...
- 【JAVA零基础入门系列】Day6 Java字符串
字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...
- 零基础学C#算法(零基础学算法——C#版)
今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...
- JSon_零基础_006_将JSon格式的字符串转换为Java对象
需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...
- 零基础学Java(4)字符串
字符串 从概念上讲,Java字符串就是Unicode字符序列.例如,字符串"Java\u2122"由5个Unicode字符J.a.v.a和组成.Java没有内置的字符串类型,而是在 ...
- 【字符串算法1】 再谈字符串Hash(优雅的暴力)
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- Android零基础入门第71节:CardView简单实现卡片式布局
还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...
- 【零基础学习iOS开发】【转载】
原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
随机推荐
- list.size() = 1 但显示 All elements are null
https://blog.csdn.net/weixin_43899069/article/details/124668722 if (CollectionUtils.isNotEmpty(list) ...
- 为什么gdb通过0地址显示偏移会提示地址错误
现象 在gdb中,如果想看一个struct的某个field的偏移量,和C语言一样可以通过对一个0地址变量取地址,然后取成员的偏移量获得.更神奇的地方在于和C语言一样,这里也不会触发内存访问异常. 另外 ...
- kubernetes强制删除namespace
1.执行命令删除namespace后一直显示Terminating,无法删除namespace [root@k8s-master1 ~]# kubectl get ns NAME STATUS AGE ...
- BurpSuite暴力破解和防御实战
burpsuite暴力破解 工具准备 burp suite 用于攻击web 应用程序的集成平台 jsEncrypter 一个用于前端加密Fuzz的Burp Suite插件,支持base64.sha.m ...
- Django 之 ORM1
1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- QListWidget调用Clear时报错:ASSERT failure in QList<T>::at: "index out of range"的解决方法
原因:连接了信号currentRowChanged(int)和槽,当选中其中的一行时,在调用Clear函数就会报错. 解决方法:不连接currentRowChanged(int)信号和槽,改为连接it ...
- jQuery 获取鼠标点击的元素ID
$(function(){ $(document).click(function(e) { // 在页面任意位置点击而触发此事件 var v_id = $(e.target).attr('id'); ...
- bean依赖注入三种方式
bean依赖注入的三种方式如下: 1.构造方法注入 2.set方法注入 3.P命名空间注入 此处演示的项目结构如下: 方法一: 构造方法注入 UserDaoImpl.java public class ...
- 使用jquery+layui 做一个输入搜索下拉 类似lay-search
效 果: 因为需要做一个搜索出现下拉然后点击 自动填装input 内容的 东西. 一开始使用lay-search 的控件去弄. 但是无法控制里面的内容.所以用了一些笨方法去弄 废话不说了, html ...
- Qt实现带有映射关系的进度条
1.编写继承自widget的新类,这里我们定义为colorWidget; 2.在colorWidget中添加私有变量QVector<QRect> m_rects,用于存放进度条的不同区间( ...