哈希在竞赛中也是一个很常用,且非常厉害的一个算法。

哈希的主要思想就是把一个东西转换成一个大整数,这样比较两个东西是否相等的就只要比较两个整数是否相等就行了,
比较的时间复杂度是O(1)的。

举一个比较常见的例子:比较俩字符串是否相等,我们可以将字符串变成一个值,然后直接比较这俩字符串的哈希值就行了。
可能你会有疑问?在c++中string 不是可以直接就比较了么? 为啥还要用哈希呢?
假如人家问的是俩矩阵是否相等呢?假如人家问这个矩阵是否在一个大矩阵中出现过呢?
那么如何存矩阵呢?我们就可以用二维哈希,将矩阵也映射成一个哈希值,这样比较矩阵直接比较哈希值就行了。

其实,通过上面你已经对哈希有了一个初步的了解了。哈希它其实就是将一些特别难存的东西,通过某种手法变成一个唯一的值,
然后只需比较哈希值就行了。

哈希常见的几种模型:

  • 一维哈希(字符串)
  • 二维矩阵哈希

核心思想:将字符串看成P进制数,P的经验值是131,13331,233,2333,10007等质数 取这些值的冲突概率低
取模的时候选一个较大的质数避免冲突。
小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果

一维哈希模板:

typedef long long int LL;
const int M=233;//是我们自己选择的进制数,一般可以选233,2333,10007等质数
const int mod=1e9+7;//一般选一个比较大的质数
LL get(string s)//获取字符串对应的哈希值
{LL sum=0;for(int i=0;i<s.size();i++) sum=(sum*M+s[i]-'a')%mod;return sum;
}
typedef unsigned long long int ull;
const int N=1e5+10;
const int M=233;
ull h[N],base[N];
ull query(int l,int r)//获取字符串[l,r]的哈希值
{return h[r]-h[l-1]*base[r-l+1];
}
void init(string s)//初始化哈希
{int n=s.size();s="0"+s;//让其下标从1开始base[0]=1;for(int i=1;i<=n;i++){h[i]=h[i-1]*M+s[i];base[i]=base[i-1]*M;// base[i]=M^i}
}
ull merge(int l1, int r1, int l2, int r2)
//求[l1,r1],[l2,r2]子串并的哈希值
{return query(l1, r1) * base[r2 - l2 + 1] + query(l2, r2);
}

字符串哈希入门:
P3370 【模板】字符串哈希
841. 字符串哈希
103. 子串查找

二维哈希模板

typedef long long int ll;
const int N=1010;
ll h[N][N],base1[N],base2[N];
int a[N][N],n,m;
void init()//构建
{base1[0]=base2[0]=1;for(int i=1;i<N;i++){base1[i]=base1[i-1]*131;base2[i]=base2[i-1]*233;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)h[i][j]=h[i][j-1]*131+a[i][j];//行哈希for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)h[i][j]=h[i-1][j]*233+h[i][j];//列哈希
}
ll query(int x1,int y1,int x2,int y2)//查询矩阵的哈希值
{return h[x2][y2]-h[x2][y1-1]*base1[y2-y1+1]-h[x1-1][y2]*base2[x2-x1+1]+h[x1-1][y1-1]*base1[y2-y1+1]*base2[x2-x1 + 1];
}

二维哈希习题:
Matrix
矩阵

好的文章推荐:
哈希入门
哈希基础例题
二维哈希

ACM入门之【哈希】相关推荐

  1. C语言oj学生成绩输入和输出,『ACM入门』蓝桥杯ACM训练系统基本输入输出教程

    在介绍训练场的OJ系统之前,首先为大家介绍一下ACM: ACM原代表美国计算机协会,因其举办的ICPC即国际大学生程序设计竞赛而闻名全世界,此项赛事要求学生的在五小时内解决全英文问题,并在效率和速度以 ...

  2. c语言记忆化搜索,HNUSTC语言基础简单数据结构acm入门第一讲搜索.ppt

    C语言基础,简单数据结构,ACM入门讲座搜索部分 Bjut:mark063 2010.10.30 1 Evaluation only. Created with Aspose.Slides for . ...

  3. ACM入门及STL简介(转)

    第一章 新手入门 1.      ACM国际大学生程序设计竞赛简介 1)      背景与历史 1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕. ...

  4. 【转载】ACM入门 .

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  5. ACM入门指南[转]

    前言: 这篇指南不对ACM/ICPC国际大学生程序设计竞赛进行介绍,计算机学子如果不了解的可以在百度上进行搜索查询,这里介绍的只是一个计算机学生想要在ACM/ICPC里进行发展的初学者.内容比较简单通 ...

  6. ACM入门之【搜索】

    搜索在ACM中是很重要的. 搜索一般分为DFS和BFS两大类,下面又划分很多的小类. 入门习题: 842. 排列数字 843. n-皇后问题 844. 走迷宫 845. 八数码

  7. ACM入门之【读入、输出优化】

    本文主要是基于oiwiki的做的总结,未来也会做一系列的相关文章.如果想继续看的话可以关注专栏. 做这个专栏的目的是因为自己最近开始系统的再打一下基础.于是想写一个专栏便于喜爱ACM的初学者入门. 目 ...

  8. 一文带你快速入门【哈希表】

    最近开始学习哈希表,为此特写一遍文章介绍一下哈希表,带大家快速入门哈希表

  9. ACM入门及STL简介

    1.       ACM 国际大学生程序设计竞赛简介 1)       背景与历史 1970 年在美国TexasA&M 大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕.1977 ...

最新文章

  1. 机器学习PAI产品架构
  2. 【转】jQuery获取Select option 选择的Text和Value
  3. Java项目:家庭理财系统(java+SSM+JSP+Tomcat8+Mysql)
  4. Docker安装Tomcat、MySQL和Redis
  5. 开源Android或将收费
  6. java 转xml 变成两根下划线_XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以...
  7. 【Hadoop Summit Tokyo 2016】企业数据分类和治理
  8. python读取excel列数据库_python中读取excel数据库
  9. C++之左值引用与右值引用
  10. 数字基带信号功率谱理论研究和实验仿真【含有MATLAB仿真实验以及实验报告】
  11. ntko office打开文件为空白
  12. 数字摄像头接口DCMI
  13. Win11系统怎么更新显卡驱动 手动更新显卡驱动程序的方法
  14. 仿百度文库解决方案——利用FlexPaper显示Flash(SWF)
  15. Codeforces 417D.Cunning Gena (状压DP)
  16. 零代码组态:搭建智慧水泥生产工艺流程
  17. vm使用PE安装系统(2)
  18. DM数据库:dm.ini参数(一)
  19. HTTP 404 错误 的具体意思
  20. 千年虫10周年了,今天才第一次碰到。

热门文章

  1. 发现你的身形——OpenCV图像轮廓
  2. 老王Python-进阶篇4-面向对象第三节
  3. 用筛选法求100以内的素数(数组)
  4. STM32F103CB 芯片FLASH DOWNLOAD编程地址范围设置相关问题记录
  5. TI-BLE协议栈的GATT
  6. python 异步编程——asyncio
  7. Tensorboard—使用keras结合Tensorboard可视化
  8. EOS 源代码解读 (2)插件-流程
  9. EOS 智能合约源代码解读 (10)token合约“简介”
  10. MAP Protocol 协议(1)初步介绍