对字符串hash的一些总结:

1,首先,我们在转化的时候,取底的时候一般是取131这些数,因为要避免不同的字符串对应相同的hash值这种情况的出现。如果卡精度的时候,我们可以采取双模数的方式尽量减少误差,(不过这种东西还是得看脸)。

2,在定义的时候,一般是为了定义成unsigned long long ,这个有一个好处,当爆int的时候,不会带上负号,就相当于对2的64次方进行取模了。

3.在进行hash的转换的时候,字符串对应的0位,hash值不是0,所以我们可以先将字符串往后移动一位再去赋值。

4,我们将一个整的字符串计算好hash值的时候,如果要取(l,r)这段区间的子串的hash值,可以采用以下公式。

ans =  hash[r] - hash[l-1]*ind[r-l+1];

A

单模数hash

题目链接:https://www.luogu.org/problemnew/show/P3370

具体思路:我们可以将字符串的每一个字符转换成数字,然后比较的时候,直接比较这个字符串对应的hash值就可以了。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
# define ll long long
# define ull unsigned long long
const int base=;//一般比ascii码值大就可以了。
const int maxn = 1e4+;
char str[maxn];
ll a[maxn];
ull Hash(char a[])
{
int len=strlen(a);
ull sum=;
for(int i=; i<len; i++)
{
sum=sum*base+(ull)a[i];
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%s",str);
a[i]=Hash(str);
}
sort(a+,a+n+);
int ans=;
for(int i=; i<=n; i++)
{
if(a[i]!=a[i-])
ans++;
}
printf("%d\n",ans);
return ;
}

双模数hash

 #include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
# define ll long long
# define ull unsigned long long
const int mod1=1e9+;
const int mod2=1e9+;
const int base=;
const int maxn = 1e4+;
char str[maxn];
struct node{
ull t1;
ull t2;
}q[maxn];
bool cmp(node s1,node s2){
return s1.t1<s2.t1;
}
ull hash1(char *a){
ull sum=;
int len=strlen(a);
for(int i=;i<len;i++){
sum=(sum*base+(ull)a[i])%mod1;
}
return sum;
}
ull hash2(char *a){
ull sum=;
int len=strlen(a);
for(int i=;i<len;i++){
sum=(sum*base+(ull)a[i])%mod2;
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%s",str);
q[i].t1=hash1(str);
q[i].t2=hash2(str);
}
sort(q+,q+n+,cmp);
int ans=;
for(int i=;i<=n;i++){
if(q[i].t1!=q[i-].t1||q[i].t2!=q[i-].t2)ans++;
}
printf("%d\n",ans);
return ;
}

B题:

题目链接:https://cn.vjudge.net/contest/276379#problem/J

题目大意:这本来是一道kmp的模板题,然后今下午打算用字符串hash做一下,结果一下午过去了,,,,

具体思路:和拓展kmp的方法相同,就是比较的时候直接比较子串的hash值就可以了。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
# define ll long long
# define ull unsigned long long
const int mod1=1e9+;
const int mod2=1e9+;
const ull base=;
const int maxn = 1e5+;
char str1[maxn],str2[maxn],com[];
ull hash1[maxn],hash2[maxn],ind[maxn];
map<char,char>vis;
void init()
{
ind[]=;
for(int i=; i<maxn; i++)
{
ind[i]=ind[i-]*base;
}
}
void hs1(char *a)
{
int len=strlen(a+);
hash1[]=;
for(int i=; i<=len; i++)
{
hash1[i]=hash1[i-]*base+(ull)a[i];
}
}
void hs2(char *a)
{
int len=strlen(a+);
hash2[]=;
for(int i=; i<=len; i++)
{
hash2[i]=hash2[i-]*base+(ull)a[i];
}
}
ull getsub1(int l,int r)
{
return hash1[r]-hash1[l-]*ind[r-l+];
}
ull getsub2(int l,int r)
{
return hash2[r]-hash2[l-]*ind[r-l+];
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",com);
scanf("%s",str1+);
for(int i=; i<; i++)
{
vis[com[i]]=char('a'+i);
}
int len=strlen(str1+);
for(int i=; i<=len; i++)
{
str2[i]=vis[str1[i]];
}
hs1(str1);
hs2(str2);
int ans=len;
for(int i=len; i<len+len; i++)
{
if(i&)continue;
int tmp=i/;
ull t1=getsub2(,len-tmp);
ull t2=getsub1(len-(len-tmp)+,len);
if(t1==t2)
{
ans=tmp;
break;
}
}
for(int i=; i<=ans; i++)
{
printf("%c",str1[i]);
}
for(int i=; i<=ans; i++)
{
printf("%c",str2[i]);
}
printf("\n");
}
return ;
}

字符串hash&&对字符串hash的理解的更多相关文章

  1. 转载:字符串hash总结(hash是一门优雅的暴力!)

    转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...

  2. cdoj1092-韩爷的梦 (字符串hash)【hash】

    http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limi ...

  3. 字符串学习总结(Hash & Manacher & KMP)

    前言 终于开始学习新的东西了,总结一下字符串的一些知识. NO.1 字符串哈希(Hash) 定义 即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复 ...

  4. BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】

    题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...

  5. 【基本算法入门-字符串哈希(Hash)】-C++

    字符串哈希入门 说得通俗一点,字符串哈希实质上就是把每个不同的字符串转成不同的整数. 为什么会有这样的需要呢?很明显,存储一个超长的字符串和存储一个超大但是能存的下的整数,后者所占的空间会少的多,但主 ...

  6. 841. 字符串哈希(hash)

    给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2l1,r1,l2,r2,请你判断[l1,r1l1,r1]和[l2,r2l2,r2]这两个区间所包含的字符串子串是否完 ...

  7. Hash记录字符串

    Hash记录字符串模板: mod常常取1e9+7,base常常取299,,127等等等....有的题目会卡Hash,因为可能会有两个不同的Hash但却有相通的Hash值...这个时候可以用双Hash来 ...

  8. 安全的字符串拷贝strcpy_s的实现与理解

    在C标准库中提供了字符串拷贝函数strcpy,而微软则为为它提供了一个更安全的版本strcpy_s,其函数原型为 errno_t __cdecl strcpy_s( char* _Destinatio ...

  9. Ruby中的Hash(哈希),你可以理解为字典

    原文链接 以下代码在Ruby 2.5.1中编译通过 定义 myHash = Hash.new myHash1 = Hash["key1" => 100, "key2 ...

随机推荐

  1. 使用flex布局调换两个按钮的位置

    组件用的时antd的Modal组件,里面的按钮需要调换一下位置 今天发现用flex布局非常方便,代码如下: display: flex; justify-content: center; flex-f ...

  2. python模拟浏览器爬取数据

    爬虫新手大坑:爬取数据的时候一定要设置header伪装成浏览器!!!! 在爬取某财经网站数据时由于没有设置Header信息,直接被封掉了ip 后来设置了Accept.Connection.User-A ...

  3. Intelligent Factorial Factorization LightOJ - 1035(水题)

    就是暴力嘛...很水的一个题... 不好意思交都... #include <iostream> #include <cstdio> #include <sstream&g ...

  4. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

  5. Kerberos无约束委派的攻击和防御

    0x00 前言简介 当Active Directory首次与Windows 2000 Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身 ...

  6. Kotlin入门简介

    Kotlin的“简历” 来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克) 起源来自JetBrains的圣彼得堡 ...

  7. listview android:cacheColorHint,android:listSelector属性作用(转)

    ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉, 原因是,滚动时,列表里面的view重绘时,用的依 ...

  8. [THUSC 2016] 补退选 (Trie树)

    link $solution:$ $Trie$树很显然吧,那么如何去处理每次询问.对于$Trie$树的每个节点放一个$vector$表示其若有$v$个人的最小时间. #include<iostr ...

  9. xampp+vscode开发php的配置流程

    一.所需文件 1.xampp集成服务器(个人使用7.1.7)https://www.apachefriends.org/download.html 2.vscode https://code.visu ...

  10. 「转」图像算法---白平衡AWB

    本文大体讲解了白平衡的算法流程,适用于想了解和学习白平衡原理的筒子们. 一般情况下要实现AWB算法需要专业的图像和算法基础,本文力图通过多图的方式,深入浅出,降低初学者理解上的门槛,让大家都理解到白平 ...