之前有写过一篇hash表,不过那是非常久远的时候了,应该是大一刚学一个学期的时候的成果,后来也就不那样写了,后来从xiaoxin那里学习了hash的写法,比较容易用也比较方便多hash,就这样。

分别按照下标从0和从1开始写了一遍。

在Hash结构体中

B是基,要求大于出现的数(如对于字符串应该大于127),可用171、191

mod是模数,最好是一个大素数,如1e9+7、1e9+9

Base是预处理出的B的幂,Base[i]表示B的i次幂

Has是前缀Hash数组

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MP make_pair
#define PB push_back
const int mod = 1e9 + ;
const double eps = 1e-;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5 + ;
const int maxm = 1e6 + ; struct Hash{
ll B,mod,len,Has[maxn],Base[maxn]; void init(char *s, int _len, ll _B, ll _mod){ // s[0] 开始
B = _B; mod = _mod; len = _len;
Base[] = ; Has[] = ;
for(int i=;i<=len;i++){
Base[i] = Base[i-]*B%mod;
Has[i] = (Has[i-]*B + s[i-])%mod;
}
} ll gethash(int l,int r){ // s[l]~s[r]
l++; r++;
return ((Has[r] - Has[l-] * Base[r-l+] % mod) + mod) % mod;
}
}; struct Hash{
ll B,mod,len,Has[maxn],Base[maxn]; void init(char *s, int _len, ll _B, ll _mod){ // s[1] 开始
B = _B; mod = _mod; len = _len;
Base[] = ; Has[] = ;
for(int i=;i<=len;i++){
Base[i] = Base[i-]*B%mod;
Has[i] = (Has[i-]*B + s[i])%mod;
}
} ll gethash(int l,int r){ // s[l]~s[r]
return ((Has[r] - Has[l-] * Base[r-l+] % mod) + mod) % mod;
}
};

调用时初始化都为:

Hash H;

H.init(s, len, 171, mod);

这种形式,其中 s 是字符数组名,len是字符串长度,171为自己指定的基,mod是自己指定的大素数。

常见写法也有通过自然溢出来完成取模的,此时就去掉所有的mod操作,将所有 ll 改为 ull 即可。

字符串匹配 - hash的更多相关文章

  1. 字符串匹配(hash算法)

    hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...

  2. 【模板】字符串匹配的三种做法(Hash、KMP、STL)

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 1行 ...

  3. Hash——字符串匹配(求s1在s2中出现的次数)

    题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BA ...

  4. 浅谈Hash在多个字符串匹配类型问题中的应用

    在生活中们有时会遇到一些有关字符串匹配的问题. 这时打暴力往往显得很愚蠢,效率低下. 所以就需要一些算法和数据结构来提高效率. Hash Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把 ...

  5. UVA 11019 Matrix Matcher ( 二维字符串匹配, AC自动机 || 二维Hash )

    题目: 传送门 题意: 给你一个 n * m 的文本串 T, 再给你一个 r * c 的模式串 S: 问模式串 S 在文本串 T 中出现了多少次. 解: 法一: AC自动机 (正解) 670ms 把模 ...

  6. 字符串匹配 ?kmp : hash

    给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整 ...

  7. 字符串匹配--Karp-Rabin算法

    主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...

  8. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  9. 字符串匹配&Rabin-Karp算法讲解

    问题描述: Rabin-Karp的预处理时间是O(m),匹配时间O( ( n - m + 1 ) m )既然与朴素算法的匹配时间一样,而且还多了一些预处理时间,那为什么我们还要学习这个算法呢?虽然Ra ...

随机推荐

  1. springboot启动流程(六)ioc容器刷新前prepareContext

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html prepareContext方法核心逻辑 上一篇文章中,我们通过createApplicati ...

  2. JavaScript Drum kit

    用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在.我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明. ...

  3. win中使用curl上传文件报错

    今天晚上复现“WordPress插件Easy WP SMTP反序列化漏洞”时,需要使用curl上传文件,我又用的windows环境,一直出错 curl: (26) couldn't open file ...

  4. python多线程与多进程异步事件框架

    多线程简单实现 #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging import queue import threading f ...

  5. 后台向前台响应的json数据格式的一些问题

    最近在写后台向前台easyUI页面发送数据时遇到的一些报错. 首先easyUI内部封装了许多的方法和对象,以至于很多参数都不清楚,需要查询,其次easyUI也是有内置ajax所以从后台响应回来的数据一 ...

  6. python-----多线程笔记

    多进程笔记: 多线程介绍: 多线程是为了同步完成多项任务,通过提高资源使用效率来提高系统的效率.线程是在同一时间需要完成多项任务的时候实现的. 最简单的比喻多线程就像火车的每一节车厢,而进程则是火车. ...

  7. LOAD DATA INFILE读取CSV中一千万条数据至mysql

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

  8. 0008SpringBoot中的spring.config.location对于运维的用处

    在工作过程中,若项目已经打好包,application.properties中的配置文件已经不能修改,但是还是需要修改一些参数或者新增一些参数的情况下怎么办? 可以单独再定义一个配置文件,比如定义名称 ...

  9. 四、vue基础--自定义组件

    1.语法:Vue.component("组件名字",{data,template}),代码如下: a. data: 必须是一个函数,有一个返回值.和vue里面的使用方法一样 b. ...

  10. JAVA开发WEBSERVICE方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...