概述:

主要用于字符串的匹配。

定义hash函数:

H(c)=(c1bm-1 +c2bm-2 +...+cmb0)mod h

对于字符串c中l-r区间的hash值:

H(l,r)=H(1,r)-H(1,l-1)*br-l+1

如果hash值很大,对h取模,一般地,用unsigned long long 来保存数据,这样溢出时就会自动对264 取模。

如果两个字符串的hash值相等,我们认为它们相同,不排除小概率事件使得两个字符串具有相同的hash值(由取模导致)。

大白书例子:

const ull base=;
//a在b中是否出现
bool contain(string a,string b)
{
int al=a.length(),bl=b.length();
if(al>bl)return false;
//计算base的al次方
ull t=;
for(int i=;i<al;i++)t*=base;
//计算a和b长度为al的前缀对应的hash值
ull ah=,bh=;
for(int i=;i<al;i++)ah=ah*base+a[i];
for(int i=;i<al;i++)bh=bh*base+b[i];
//对b不断的右移一位,更新hash值并判断
for(int i=;i+al<=bl;i++)
{
if(ah==bh)return true;
if(i+al<bl)bh=bh*base+b[i+al]-b[i]*t;
}
return false;
}
//a的后缀和b的前缀相等的最大长度
int overlap(string a,string b)
{
int al=a.length(),bl=b.length();
int ans=;
ull ah=,bh=,t=;
for(int i=;i<=min(al,bl);i++)
{
ah=ah+a[al-i]*t;
bh=bh*base+b[i-];
if(ah==bh)ans=i;
t*=base;
}
return ans;
}

HDU - 4300

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a)) const ull base=;
int mp[];
int h(string s)
{
int l=s.size();
int mn=;
ull ph=,sh=,t=;
for(int i=;i<l/;i++)
{
ph=ph*base+mp[s[i]-'a'];
sh=(s[l-i-]-'a')*t+sh;
if(ph==sh)mn=i+;
t*=base;
}
for(int i=;i<l-mn;i++)putchar(s[i]);
for(int i=;i<l-mn;i++)putchar(mp[s[i]-'a']+'a');
puts("");
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int T;
string s,t;
cin>>T;
while(T--)
{
cin>>t>>s;
for(int i=;i<;i++)mp[t[i]-'a']=i;
h(s);
}
return ;
}

算法笔记--字符串hash的更多相关文章

  1. 算法笔记字符串处理问题H:编排字符串(2064)

    题目描述 请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如 输入:EricZ 输出:1=EricZ 输入:David 输出:1=David 2=EricZ 输入:Peter 输出: ...

  2. HDU 1880 魔咒词典 (字符串hash)

    <题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...

  3. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  4. 记录几个经典的字符串hash算法

    记录几个经典的字符串hash算法,方便以后查看: 推荐一篇文章: http://www.partow.net/programming/hashfunctions/# (1)暴雪字符串hash #inc ...

  5. KMP替代算法——字符串Hash

    很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...

  6. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...

  7. 字符串查找算法的改进-hash查找算法

    字符串查找即为特征查找: 特征即位hash: 1.将待查找的字符串hash: 2.在容器字符串中找头字符匹配的字符串,并进行hash: 3.比较hash的结果:相同即位匹配: hash算法的设计为其中 ...

  8. 字符串Hash学习笔记

    [toc] # 以下内容作废,太多错误了,等我有时间重写 说一下什么是Hash,说白了就是把一大坨字符用一些神奇的数来表示,可以说是把字符加密了. 简单一点就是一个像函数一样的东西,你放进去一个值,它 ...

  9. 字符串Hash算法比较

    基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m> ...

随机推荐

  1. Summary: Binary Search

    Iterative ways: int binarySearch (int[] a, int x) { int low = 0; int high = a.length - 1; int mid; w ...

  2. sql可重复执行语句例子

    1.添加字段 SET @add_key_type_to_report = (SELECT IF( (SELECT count(1) FROM INFORMATION_SCHEMA.COLUMNS WH ...

  3. AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) Chapter 3. Data Structures Fundamental Data Structures

    10410 这题说的是给了一棵多叉树的 bfs遍历轨迹 和dfs 遍历 轨迹 在父节点向叶子节点扩展的时候优先遍历编号较小的节点.我还原出这课树特殊判定 根据bfs的顺序来建立这课树,用一个队列安排要 ...

  4. cf 459E

    cf459E 这题说的是 给定一个n点m条边的带边权的有向图,从中找出一条路径(可以带环),该路径包含的边数最多,并且要求路径中的权值必须严格递增,然后对边进行排序完个后采用dp去解特殊判断一下边权值 ...

  5. html5设置全屏模式--开发游戏必备

    <!-- uc强制竖屏 --> <meta name="screen-orientation" content="portrait"> ...

  6. 【百度统计】设置页面元素点击事件转化pv、uv

    html元素点击事件内添加代码:_hmt.push(['_trackEvent', category, action, opt_label, opt_value]); 1. '_trackEvent' ...

  7. python函数里面,一个*是可变参数的元祖,两个*是可变参数的字典

    python的函数中,有时会有类似*args,**keys这样的参数,代表的是可变参数,一个*表示元祖,两个*表示字典,就是说这个函数可以接受任何类型的参数,都不会报错,有些函数为了提高可用性,会加这 ...

  8. python 文件操作 练习:取得文件的最后存取时间

    #coding=utf-8 import osimport time file_atime=int(os.path.getatime('d:\\a.txt'))print "file_ati ...

  9. xShell终端中文乱码完全解决方法

    xShell终端中文乱码完全解决方法 xShell(xShell5)以及其他终端中文乱码的原因无非有三种:(1)Linux系统的编码问题:(2)xShell终端的编码问题: (3)两端的语言编码不一致 ...

  10. PHP_SELF变量解析和重复路径解决

    最近升级PHP到PHP7版本,并重新部署了新的Nginx,启动的时候发现了一个问题,全局变量$_SERVER['PHP_SELF']的值发生了改变,从而影响到代码的功能.因此我们来了解下$_SERVE ...