学习笔记-Rabin-Karp哈希
在数学一本通上看过这两人名字,现在又出现了...
思想:
用一个整数表示一个字符串
\(w_{str}\)=(\(a_0\) \(p^{n-1}\)+\(a_1\) \(p^{n-2}\)+...+\(a_{n-1}\) \(p^0\)) (\(MOD\) \(q\))
注意:
字符转换成\(a_n\)时最好不要转为0,例如遇到"a","aa","aaa"的情况
优越之处:
我们可以在O(1)内取出任意子串的Hash值
怎么实现?
- 记录下所有前缀的Hash值
我们知道
\(w_{pre_{i-1}}\) \(=(\) \(a_0\) \(p^{i-1}\)+\(a_1\) \(p^{i-2}\)+...+\(a_{i-1}\) \(p^0\)) (\(MOD\) \(q\))
\(w_{pre_{j}}\) \(=(\) \(a_0\) \(p^{j}\)+\(a_1\) \(p^{j-1}\)+...+\(a_{j}\) \(p^0\)) (\(MOD\) \(q\))
所以
- \(w_{str_{i,j}}\)
\(=(\) \(a_i\) \(p^{j-i}\)+\(a_{i+1}\) \(p^{j-i-1}\)+...+\(a_{j}\) \(p^0\))
\(=\) \(w_{pre_{j}}\) \(-\) \(w_{pre_{i-1}}\) \(p^{j-i+1}\) (\(MOD\) \(q\))
然而....
在做TJOI2017 DNA时我发现取模太慢了,不如用unsigned long long自然溢出,这样一下就快了很多。
同时还有一个优化技巧,预处理出p值的幂,这样也能快不少。
应用:
字符串匹配
思路:
和KMP一样是\(O(N+M)\)的时间复杂度,只需要遍历文本串比较哈希值就可以了。
题目:
这个比较多应该都找得到
求最长公共前缀(Longest Common Prefix):
给定两个字符串a,b,有m个询问,每次分别给出两个起始位置x,y,求a串从x开始,b串从y开始的最长公共前缀(LCP)长度;
思路
二分+RK Hash
如上文预处理出每个前缀的Hash值,我们就能O(1)内求出子串Hash值,然后不断二分长度L就好了
根据fstqwq的说法,时间复杂度 \(O(m\log L)\)
然而,自己摸索出了一个骚操作(好象又在哪里听过这种做法?),用倍增,因为二分的上下届可能比较大,不如倍增来的快.
题目:
--update--
TJOI2017DNA
https://www.luogu.org/problemnew/show/P3763我的题解:https://www.luogu.org/blog/Rye-Catcher/solution-p3763
luogu上搜中文和算法都没有,搜英文有一道CF的题不过要用树链剖分,可惜我现在的知识点不够;
另外我惊人地发现一道JSOI2008火星人的题目和SP3109 STRLCP - Longest Common Prefix几乎一模一样
学习笔记-Rabin-Karp哈希的更多相关文章
- Perl学习笔记(3)----遍历哈希表的一个容易疏忽的地方
今天做 Google的 Code Jam 上的一道题目:https://code.google.com/codejam/contest/351101/dashboard#s=p2,用Perl语言解答的 ...
- 【Redis】命令学习笔记——哈希(hash)(15个超全字典版)
本篇基于redis 4.0.11版本,学习哈希(hash)相关命令. hash 是一个string类型的field和value的映射表,特别适合用于存储对象. 序号 命令 描述 实例 返回 HSET ...
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
[译]聊聊C#中的泛型的使用(新手勿入) 写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Memcached学习笔记
[TOC] 前言 此为学习笔记汇总,如有纰漏之处,还望不吝指出,谢谢. 启动流程 调用settings_init()设定初始化参数 从启动命令中读取参数来设置setting值 设定LIMIT参数 开始 ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
随机推荐
- webpack概述——资源、样式、图片的打包工具
官方地址:https://www.webpackjs.com/ Concepts At its core, webpack is a static module bundler for modern ...
- Django之Form、跨站请求以及cookie、session
Form表单 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的意义: req ...
- thymeleaf中switch case多出一个空行
以下是<thymeleaf3.0.5中文参考手册.pdf>中的代码,官方代码没有具体去查询. <div th:switch="${user.role}"> ...
- LeetCode_121. Best Time to Buy and Sell Stock
121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...
- sonarqube-jenkins-config
Sonar Config .Jenkinsfile config stage('SonarQube analysis') { steps { script { scannerHome = tool ' ...
- 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置
处理[由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面] 详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 ...
- render()中添加js函数
方案一: { title: '操作', key: 'operation', render: (_, record) => ( <div> <Link to={`/hostMai ...
- vue路由传参的三种方式
方式一 通过query方式传参 这种情况下 query传递的参数会显示在url后面 this.$router.push({ path: '/detail', query: { id: id } }) ...
- 【数据库开发】在Windows上以服务方式运行 MSOPenTech/Redis
在Windows上以服务方式运行 MSOPenTech/Redis ServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来做开发环境,现在这 ...
- linux 安装了Linux generic mysql 出错
在一次安装 Linux generic cmake 出错 提示:CMake Error: The source directory "/usr/local/src" does no ...