# 滚动Hash
滚动Hash
假设字符串\(C=c_1*c_2*...c_m\),定义Hash函数\(H(C)=(C_1*b^{m-1}+C_2*b^{m-2}+...C_m*b^{0})mod\; h\)
从k开始长为|m|的子串的hash值转移到从k+1开始长为|m|的字串的hash值的转移公式为 :$$H(S[k+1..k+m]=(H(S[k..k+m-1])b-s_kb^m+s_{k+m}$$
基数使用1e7以上的素数减少冲突,使并且用\(ull\)自然溢出代替取模运算,滚动Hash的期望复杂度为\(O(n+m)\)。
给出字符串S和T,求S在T中出现的次数。
AcCode:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef unsigned long long ull;
const ull B = 100000007;//Hash基数
int n;
char w[10010],t[1000010];
int main(){
scanf("%d",&n);
while(n--){
scanf("%s%s",w,t);
int lw=strlen(w),lt=strlen(t);
ull wh=0,th=0,base=1;
//计算W和T串从第一位开始的长度为lenw的Hash值
for(int i=0;i<lw;i++)
wh=wh*B+w[i],th=th*B+t[i];
//计算base的lenw次方,用于Hash转移
for(int i=0;i<lw;++i)base*=B;
int ans=0;
for(int i=0;i+lw<=lt;++i){
if(wh==th)ans++;
if(i+lw<lt)th=th*B+t[i+lw]-t[i]*base;//这里减法可能会溢出,但是利用无符号数的自然溢出就无需加上一个模数了
}
printf("%d\n",ans);
}
return 0;
}
# 滚动Hash的更多相关文章
- poj 3461 hash解法
字符串hash https://blog.csdn.net/pengwill97/article/details/80879387 https://blog.csdn.net/chaiwenjun00 ...
- 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论
1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...
- Rabin-Karp ACM训练
求解问题 寻找S中T出现的位置或次数.假设S的长度为n, T的长度为m, 通过枚举S长度为m的字串的hash值与T的hash值比较.此时使用滚动hash的优化使复杂度不为O(mn). 算法说明 滚动h ...
- hash实现锚点平滑滚动定位
一.科普时间 hash hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分). location.hash=anchorname. 锚点 锚点是网页制作中超级链接 ...
- poj1200 字符串hash 滚动哈希初探
假如要判断字符串A“AABA”是否是字符串B“AABAACAADAABAABA”的子串 最朴素的算法是枚举B的所有长度为4的子串,然后逐个与A进行对比,这样的时间复杂度是O(mn),m为A的长度,n为 ...
- 超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用)
超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用) 转载自:https://www.jianshu.com/p/2ad8c8b5bf75 亲测有效~ <tem ...
- 关于url中的#-----hash
前言:不知道你们对url地址中的#一开始是怎么理解的,反正我以前一直都是默认那就是本页面中该id的位置.今天看了篇文章,才把这个真正透彻理解. 1,#涵义 #代表网页中的一个位置.其右面的字符,就是该 ...
- angular 滚动
AngularJs $anchorScroll.$controller.$document $anchorScroll 根据HTML5的规则,当调用这个函数时,它检查当前的url的hash值并且滚动到 ...
- jquery “做页面滚动到某屏时改变状态标题” 所用知识点记录
浏览器滚动条滚动时触发事件 //浏览器滚动条滚动时触发事件 $(window).scroll(function(){}); 浏览器窗口大小改变时触发事件 //浏览器窗口大小改变时触发事件 $(wind ...
随机推荐
- mysql建表问题
PUBLIC Stack Overflow Tags Users Jobs TeamsQ&A for workLearn More MySQL error: The maximum col ...
- jinja2-宏,include, import
一 宏 宏类似常规编程语言中的函数.它们用于把常用行为作为可重用的函数,取代 手动重复的工作.如果宏在不同的模板中定义,你需要首先使用 import,比如 {% macro input(name, v ...
- vuejs是如何编译checkbox数组的v-model的
随便用官方的例子编译了一下, 发现如下 _c("input", { directives: [ { name: "model", rawName: " ...
- 关于IC电源管脚去耦电容
原文地址:https://mp.weixin.qq.com/s/0dAyTpAcQWXlYULqCeKgFA 每个集成电路(IC)都必须使用电容将各电源引脚连接到器件上的地,原因有二:防止噪声影响其本 ...
- vsftp配置详解
vsftpd作为一个主打安全的FTP服务器,有很多的选项设置.下面介绍了vsftpd的配置文件列表,而所有的配置都是基于vsftpd.conf这个配置文件的.本文将提供完整的vsftpd.conf的中 ...
- gitlab安装、下载、推送 代码(推荐)
环境: 内存必须5G以上 centos7.5 服务端:192.168.0.74 客户端:192.168.0.73 GitLab的安装 1.在CentOS系统上,下面的命令将会打开系统防火墙HTTP和S ...
- RegexBuddy 4.7.0 x64 评估试用到期,无限试用的办法
http://www.cnblogs.com/inrg/p/6491043.html 最后对比发现,在注册表 HKEY_USERS 节点下存在一个用户的项,形如 "S-1-5-21-1609 ...
- .Netcore 2.0 Ocelot Api网关教程(6)- 配置管理
本文介绍Ocelot中的配置管理,配置管理允许在Api网关运行时动态通过Http Api查看/修改当前配置.由于该功能权限很高,所以需要授权才能进行相关操作.有两种方式来认证,外部Identity S ...
- 深入浅出的分析 Set集合
01. 摘要 Set集合的特点主要有:元素不重复.存储无序的特点. 打开 Set 集合,主要实现类有 HashSet.LinkedHashSet .TreeSet .EnumSet( RegularE ...
- Java基础——接口和抽象类
接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...