哈希

Tags:字符串

作业部落

评论地址


一、概述

百度百科:

散列表(Hash table/哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。

哈希表常用于比较两个字符串是否相同(可以把状态看作字符串,从而比较状态是否相同)

二、实现方式

一个例子

通常将其看成一个进制数,比如\(ABAF\)看成\(1216\),那么哈希值就是\(Hash=1*base^3+2*base^2+1*base+6\),\(base\)可以自由决定,如果说状态量有限,可以使用较小的\(base\)使得所有状态不冲突,若状态量较大且分散,可以采用取模或者自然溢出的方式尽可能避免冲突

优缺点

优点是可以\(O(1)\)比较(数组是\(O(1)\)如果用map就要加一个\(log\))

缺点是会有冲突,为避免冲突可以选择双哈希或三哈希等(选取不同的模数)

哈希方式

1.进制哈希(用于判断状态/数组是否相同)

\[Hash[i]=Hash[i-1]*base+val[i]$$优点:方便好写
   状态量小时哈希过程可逆(见[一双木棋](https://www.luogu.org/problemnew/show/P4363))
缺点:毒瘤出题人卡自然溢出,采用双哈希
   状态量大时哈希过程不可逆(不能通过Hash值还原数组)
使用范围:基本上这么写

>2.树哈希(用于判断树的同构)

$$Hash[x]=\sum_{异或和}(Hash[son_{1...k}]+base1)*(siz[x]+base2)+deep[x]*base3$$其实没有一定要求这么写,只是树的同构要求深度相同,孩子也同构但是与孩子的顺序无关,所以信息就是儿子的$Hash$和深度和大小,可以灵活处理

千古神犇陈菊开安利的一种写法:$$Hash[x]=(\sum{Hash[son]})^{size[x]}\]

注意:base的选取原则是使得Hash值尽可能分散,尽可能少的冲突

优点:这里不用累乘而用异或和,使得Hash过程可逆(也就是在树DP中方便换根/删点

缺点:没有固定套路,灵活多变(有次考试不管怎么调\(base\)总是过不了,把异或和改成累乘马上就过了,原因是数据范围小,Hash值密集容易造成冲突)

三、题单

四、代码

// [九省联考2018]一双木棋chess
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<map>
#define ll long long
using namespace std;
int N,M,A[11][11],B[11][11],b[11];
map<ll,int>Map;
ll HASH()
{
ll Hash=0;
for(int i=1;i<=N;i++) Hash=Hash*11+b[i];
return Hash;
}
void ReHash(ll Hash)
{
for(int i=N;i>=1;i--) b[i]=Hash%11,Hash/=11;
}
int DFS(int op,ll Hash)
{
if(Map[Hash]) return Map[Hash]==-1?0:Map[Hash];
ReHash(Hash);int ans=1e9*(-op);
for(int i=1;i<=N;i++)
if(b[i]<b[i-1])
{
b[i]++;int tmp=DFS(-op,HASH());
if(op==1) ans=max(ans,tmp+A[i][b[i]]);
else ans=min(ans,tmp-B[i][b[i]]);
b[i]--;
}
if(ans==1e9*(-op)) ans=0;
Map[Hash]=(ans==0?-1:ans);
return ans;
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&A[i][j]);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&B[i][j]);
b[0]=M;
printf("%d\n",DFS(1,0));
return 0;
}

字符串Hash/树Hash学习笔记的更多相关文章

  1. No1_6.字符串的基本操作2_Java学习笔记

    import java.util.Scanner; import java.util.regex.Pattern; public class HelloString2 { public static ...

  2. No1_5.字符串的基本操作_Java学习笔记

    import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import java. ...

  3. 主席树初步学习笔记(可持久化数组?静态区间第k大?)

    我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...

  4. 线段树合并学习笔记(P4556)

    直入主题: 学习线段树合并..... 从名字就能看出,这个东西要合并线段树..... 线段树怎么能合并呢...... 暴力合就行了啊...... 一次从上往下的遍历,把所有的节点信息暴力合并,然后就没 ...

  5. 字典树(Trie)学习笔记

    目录 什么是字典树 如何存储字典树 如何查找字符串有没有出现 第一个图的那种线段树 应用 例题 1.统计难题 2.P2580 于是他错误的点名开始了 什么是字典树 上图来自luogu题解 这是一种字典 ...

  6. BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Statu ...

  7. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  8. POJ2104 K-th Number[主席树]【学习笔记】

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51440   Accepted: 17594 Ca ...

  9. Linxu内核版本号后面多出字符串或者+号【学习笔记】

    作者:庄泽彬 之前一直没有留意到但是最近在编译内核的时候版本号竟然多出了个加号+号或字符串, 后面终于找到原因了,原来config如果设置了CONFIG_LOCALVERSION_AUTO=y,内核的 ...

随机推荐

  1. ubuntu-15.04-desktop-amd64想要安装KDE桌面,结果出现如下问题

    The following packages have unmet dependencies: kubuntu-desktop : Depends: ark but it is not going t ...

  2. Linux man 命令详细介绍

    知道linux帮助文件(man-pages,手册页)一般放在,$MANPATH/man 目录下面,而且按照领域与语言放到不同的目录里面. 看了上一章,要找那个命令使用相关手册,只要我们按照领域区分,到 ...

  3. flask的g对象

    故名思议我们可以理解这个g对象是一个全局的对象,这个对象存储的是我们这一次请求的所有的信息,只是存储这一次的请求 g:global 1. g对象是专门用来保存用户的数据的.  2. g对象在一次请求中 ...

  4. 用CHTCollectionViewWaterfallLayout写瀑布流

    用CHTCollectionViewWaterfallLayout写瀑布流 实现的瀑布流效果图: 源码: WaterfallCell.h 与 WaterfallCell.m // // Waterfa ...

  5. 详细透彻解读Git与SVN的区别(集中式VS分布式)

    Git是目前世界上最先进的分布式版本控制系统,其实 Git 跟 SVN一样有自己的集中式版本库或服务器,但是Git 更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect ou ...

  6. Test checkout of feature 'Compiler' failed 解决方法(转载)

    Test checkout of feature 'Compiler' failed.   2014a的解决办法 适用于已安装compiler但破解不完全的, ht—tp://pan.baidu.co ...

  7. [EffectiveC++]item45:运用成员函数模板接受所有兼容类型

  8. 汉诺塔问题php解决

    面向过程解决 <?php function hanio($n,$x,$y,$z){//把n个盘子,按照要求从x移到z,y是中介 //递归跳出条件 if($n==1){ move($n, $x, ...

  9. AOP-方法拦截器-笔记

    方法拦截器的继承层次图: 这些拦截器具体长什么样?? 一.MethodBeforeAdviceInterceptor 这个拦截器只有一个属性就是前置通知.需要注意的是前置通知和返回通知的拦截器才会持有 ...

  10. 如何搭建github+hexo博客-转

    1.前言 其实早在这之前我就一直想过写博客,但由于种种原因一直没有去学习这方面的知识,最近半个月(从开始动手到搭建好)一直陆陆续续的在着手这方面的工作.从开始到搭建完成的过程中遇到了很多困难,因为在这 ...