首页 > 其他分享 >关于一些哈希

关于一些哈希

时间:2024-11-18 21:41:49浏览次数:1  
标签:hash int 关于 哈希 序列 一些 lld mod

随缘更新,但考虑到马上要退役,毕业前应该没机会力。

求字符串的最长公共前缀

标准

空间复杂度:\((\sum_i |s_i|)\),但根据具体场景通常可以缩小至\(O(n)\)。
时间复杂度:\(O(\sum_i |s_i|)\)预处理,\(O(\log min(|s_i|,|s_j|))\)求两字符串的最长公共前缀

对于每个字符串,预处理其前缀hash数组。查询时二分找到最小的位置mid,令hash(i,mid)=hash(j,mid)。

使用这个技巧的题目,时间复杂度可能为\(O(n\log n)\)。

变形

TJOI2017 DNA为例。

题目描述

加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列 \(S\),有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列 \(S\),任意修改其中不超过 \(3\) 个碱基,依然能够表现出吃藕的性状。现在研究人员想知道这个基因在 DNA 链 \(S_0\) 上的位置。所以你需要统计在一个表现出吃藕性状的人的 DNA 序列 \(S_0\) 上,有多少个连续子串可能是该基因,即有多少个 \(S_0\) 的连续子串修改小于等于三个字母能够变成 \(S\)。

对于 \(100\%\) 的数据,\(S_0,S\) 的长度不超过 \(10^5\),\(0\lt T\leq 10\)。

做法

二分哈希,找到前三个需要修改的字符(即无法匹配之处),判断剩余部分是否可以匹配。

取出整段哈希中的一个区间

标准

不知道怎么描述,看代码差不多就能理解吧!

#define lld unsigned long long
// 这是个不太好的习惯,最好用ull表示……
const lld base = 233, mod = 1e9+7; // 貌似自然溢出也很好
lld hash[N], bw[N]; // hash有撞函数的可能,实际写代码时建议换一个函数名

lld get(int l, int r){ // 取区间[l,r]的哈希值
    return (hash[r]-hash[l-1]*bw[r-l+1]%mod+mod)%mod;
}

int main(){
    bw[0] = 1, hash[0] = 0;
    for(int i = 1; i <= n; i++){ // 预处理
        hash[i] = (hash[i-1]*base%mod+s[i])%mod;
        bw[i] = bw[i-1]*base%mod;
    }
}

例题

[ARC172C] Election:差不多就是板子的意味,但是比起板子,可以更快地上手哈希,对(我这样的)新手很有帮助。

[JSOI2009] 电子字典:这题有更简洁的写法,可以不用取区间再合并,但推荐写一写,熟悉一些细节的处理。注意常数大小,最好用set而非map

标签:hash,int,关于,哈希,序列,一些,lld,mod
From: https://www.cnblogs.com/meteor2008/p/18553672

相关文章

  • 一些值得注意的STL使用,用错了可能就复杂度错误了
    前言一些见到(或看到别人,或写了)的问题就记一下吧正文lower_boundSTL分为两类,一类是支持随机访问的,另一类是不支持随机访问的。而不支持随机访问的,若使用lower_bound函数,请一定要使用.....lower_bound(...),因为这样的复杂度是对的(\(\log\)),否则就是线性的。我在cpprefernce上......
  • 关于Hive使用的一些技巧
    1、可以直接不进入hive的情况下执行sql语句通过shell的参数-e可以执行一次就运行完的命令hive-e"select*fromyhdb.student"hive-S-e"set"|grepcli.print-S是静默模式,会省略掉多余的输出假如我想在查询语句的结果上面显示字段名称,可以将sethive.cli.pr......
  • rust学习九.3-集合之哈希映射表
    这里介绍的哈希映射表(HashMap)并非是java那样的万用表,限制很大。不过,话说回来,rust应该是有类似java那样的映射表,不过不是这个哈希映射表。现在先谈论哈希映射表吧。 一、构成和定义HashMap是最不常用的,所以并没有被prelude自动引用。标准库中对HashMap的支持也相对较少......
  • 记录一些旧版本 MySQL 的问题与处理
    旧版本相关资源下载:https://downloads.mysql.com/archives/(以下版本号均为实测版本号,不代表同大版本下的其它小版本行为也会一致)1、MySQL5.1.46版本-使用命令或服务运行数据库时,不需要也不支持通过参数初始化数据库(下载的压缩包内已有初始数据)-默认的root用户密码为空,所......
  • H.264/H.265播放器EasyPlayer.js网页直播/点播播放器关于播放的时候就有声音
    EasyPlayer.jsH5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式,支持Windows、Linux、Android、iOS全平台终端的H5播放器,使用简单......
  • H.265流媒体播放器EasyPlayer.js无插件H5播放器关于页面首次加载超时检测
    EasyPlayer.js网页直播/点播播放器是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版以及js版,其中js版本作为网页播放器,受到了用户的广泛使用。在功能上,EasyPlayer.js播放器支持直播、点播、录像、快照截图......
  • 网页直播/点播播放器EasyPlayer.js RTSP播放器关于硬解码或者video标签渲染自动播放
    EasyPlayer.jsRTSP播放器是一个基于WebRTC(网页实时通信技术)的开源JavaScript库,主要用于在网页上实现视频播放功能,特别是针对RTSP(RealTimeStreamingProtocol,实时流协议)流的播放。它允许开发者在不需要安装额外插件或软件的情况下,直接在网页中嵌入和播放来自监控摄像头或其他R......
  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......
  • H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到
    EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式,也能支持WebSocket-FLV、HTTP-FLV、HLS(m3u8)、WebRTC、ws-fmp4、http-fmp4等格式......
  • 关于数值交换
    如何在c语言环境中定义一个函数,让他实现交换两个整型的数值?第一次拿到这个问题时,第一反应是这不简单吗?然后尝试写了代码如下:1在这段代码中,我们先把a 的值存到temp 中,然后把b 的值赋给a,最后把temp(也就是原来a 的值)赋给b,完成交换。<借助临时变量交换,......