【蓝桥杯集训8】哈希表专题(3 / 3)
创始人
2024-05-27 04:11:15
0

目录

手写哈希表

1、开放寻址法

2、拉链法

字符串前缀哈希表法

2058. 笨拙的手指 - 哈希表 + 秦九韶算法(进制转换)+ 枚举

秦九韶算法——将x进制数转化为十进制数


手写哈希表

活动 - AcWing

1、开放寻址法

设 h(x)=k,也就是 x 的哈希值为 k

如果在 hash[k]的位置已经有元素,持续往后遍历直到找到 >x(询问)或为空(插入)为止

注意开放寻址法一般会把数组开到数据范围的 2−3 倍,能提高效率

import java.util.*;class Main
{static int N=200003,nul=0x3f3f3f3f; //质数static int[] h=new int[N];public static int find(int x){int k=(x%N+N)%N;while(h[k]!=nul&&h[k]!=x) //如果该坑位不为空且该坑位不为x(如果x已经存过就不存了){k++;if(k==N) k=0;}return k; //如果找到x,则返回x所在的位置//如果没有找到x,则返回x应该存放的位置}public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();Arrays.fill(h,nul);while(n-->0){String s=sc.next();int x=sc.nextInt();int k=find(x);if(s.equals("I")) h[k]=x;else if(s.equals("Q")){if(h[k]!=nul) System.out.println("Yes");else System.out.println("No");}}}
}

2、拉链法

设 h(11)=3,h(23)=3 ,这就是一种冲突

我们可以设一个数组h,也就是哈希的结果

对于每一个结果k,建立一个链表

把映射为 k 的所有数 x 都放在 h[k] 这个链表里

import java.util.*;class Main
{static int N=100003; //质数static int[] h=new int[N],e=new int[N],ne=new int[N];static int idx;public static void insert(int x){int k=(x%N+N)%N; //+N%N是为了让负数变成正数e[idx]=x;ne[idx]=h[k];h[k]=idx++;}public static boolean find(int x){int k=(x%N+N)%N;for(int i=h[k];i!=-1;i=ne[i])if(e[i]==x) return true;return false;}public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt();Arrays.fill(h,-1);while(n-->0){String s=sc.next();int x=sc.nextInt();if(s.equals("I")) insert(x);else if(s.equals("Q")){if(find(x)) System.out.println("Yes");else System.out.println("No");}}}
}

 

字符串前缀哈希表法

把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字

对形如 X_{1}X_{2}X_{3}......X_{n-1}X_{n} 的字符串,采用字符的ascii 码乘上 P 的次方来计算哈希值

映射公式 (X_{1}\times P^{n-1}+X_{2}\times P^{n-2}+......+X_{n-1}\times P^{1}+X_{n}\times P^{0})mod\ Q

注意:

  • 任意字符不可以映射成0,否则会出现不同的字符串都映射成0的情况,比如A,AA,AAA皆为0
  • 通过巧妙设置P (13113331) , Q (2^{64})的值,一般可以理解为不产生冲突

比较不同区间的子串是否相同,就转化为对应的哈希值是否相同

求一个字符串的哈希值就相当于求前缀和,求一个字符串的子串哈希值就相当于求部分和

字符串前缀和公式:

h[i] = h[i-1]*P + s[i];

区间和公式:h[l,r]=h[r]-h[l]*P^{r-l+1}

区间和公式的理解: ABCDE 与 ABC 的前三个字符值是一样,只差两位,
乘上 P^{2} 把 ABC 变为 ABC00,再用 ABCDE - ABC00 得到 DE 的哈希值

活动 - AcWing

题目:

import java.util.*;class Main
{static int N=100010;static long[] h=new long[N],p=new long[N];static int P=131;public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt(),m=sc.nextInt();String s="/"+sc.next();//下标从1开始p[0]=1;for(int i=1;i<=n;i++){p[i]=p[i-1]*P;h[i]=h[i-1]*P+s.charAt(i);}while(m-->0){int l1=sc.nextInt(),r1=sc.nextInt();int l2=sc.nextInt(),r2=sc.nextInt();long h1=h[r1]-h[l1-1]*p[r1-l1+1];long h2=h[r2]-h[l2-1]*p[r2-l2+1];System.out.println(h1==h2?"Yes":"No");}}
}

2058. 笨拙的手指 - 哈希表 + 秦九韶算法(进制转换)+ 枚举

2058. 笨拙的手指 - AcWing题库

题目:

第一行给你一个N的二进制表示,其中有一位是错误的

第二行给你一个N的三进制表示,其中有一位是错误的

输出N的正确十进制值(题目保证一定有唯一解)

思路:

枚举二进制数a的所有换1位的情况,转化为十进制值存入哈希表

枚举三进制数b的所有换1位情况,转化为十进制后在哈希表中查询是否存在 

因为题目保证一定有唯一解,所以两者交集即为答案

因此如果查询到,则输出

秦九韶算法——将x进制数转化为十进制数

public static int get(String s,int x)
{int res=0;for(int i=0;i
import java.util.*;class Main
{static int N=100010;public static int get(char[] s,int x)//将x进制数s转化为十进制数{//秦九韶算法int res=0;for(int i=0;i st=new HashSet<>();for(int i=0;i

相关内容

热门资讯

安卓系统和oppo系统哪个流畅... 你有没有想过,手机系统哪个更流畅呢?安卓系统和OPPO系统,这两个名字听起来就让人心动。今天,咱们就...
安卓怎么用微软系统,利用微软系... 你是不是也和我一样,对安卓手机上的微软系统充满了好奇?想象那熟悉的Windows界面在你的安卓手机上...
安卓系统如何安装nfc,安卓系... 你有没有想过,用手机刷公交卡、支付账单,是不是比掏出钱包来得酷炫多了?这就得归功于NFC技术啦!今天...
ios系统可以转安卓,跨平台应... 你有没有想过,你的iPhone手机里的那些宝贝应用,能不能搬到安卓手机上继续使用呢?没错,今天就要来...
iOSapp移植到安卓系统,i... 你有没有想过,那些在iOS上让你爱不释手的app,是不是也能在安卓系统上大放异彩呢?今天,就让我带你...
现在安卓随便换系统,探索个性化... 你知道吗?现在安卓手机换系统简直就像换衣服一样简单!没错,就是那种随时随地、随心所欲的感觉。今天,就...
安卓系统安装按钮灰色,探究原因... 最近发现了一个让人头疼的小问题,那就是安卓手机的安装按钮突然变成了灰色,这可真是让人摸不着头脑。你知...
安卓7.1.1操作系统,系统特... 你知道吗?最近我在手机上发现了一个超级酷的新玩意儿——安卓7.1.1操作系统!这可不是什么小打小闹的...
安卓os系统怎么设置,并使用`... 你有没有发现,你的安卓手机有时候就像一个不听话的小孩子,有时候设置起来真是让人头疼呢?别急,今天就来...
安卓降低系统版本5.1,探索安... 你知道吗?最近安卓系统又来了一次大动作,竟然把系统版本给降到了5.1!这可真是让人有点摸不着头脑,不...
解放安卓系统被保护,解放安卓系... 你有没有想过,你的安卓手机其实可以更加自由地呼吸呢?是的,你没听错,我说的就是解放安卓系统被保护的束...
校务帮安卓系统下载,便捷校园生... 你有没有想过,你的手机里装了一个神奇的助手——校务帮安卓系统下载?没错,就是那个能让你轻松管理学校事...
安卓系统没有拼多多,拼多多崛起... 你知道吗?最近我在手机上发现了一个小小的秘密,那就是安卓系统里竟然没有拼多多这个应用!这可真是让我大...
甜城麻将安卓系统,解锁全新麻将... 你有没有听说过那个超级火的甜城麻将安卓系统?没错,就是那个让无数麻将爱好者为之疯狂的软件!今天,就让...
安卓系统卸载的软件,深度揭秘卸... 手机里的软件越来越多,是不是感觉内存不够用了?别急,今天就来教你怎么在安卓系统里卸载那些不再需要的软...
安卓系统推荐好游戏,畅享指尖乐... 手机里的游戏可是咱们休闲娱乐的好伙伴,尤其是安卓系统的用户,选择面那可是相当广呢!今天,就让我来给你...
王者安卓系统怎么卖,揭秘如何轻... 你有没有听说最近王者安卓系统的火爆程度?没错,就是那个让无数玩家沉迷其中的王者荣耀!今天,我就来给你...
安卓开发系统内置证书,基于安卓... 你有没有想过,你的安卓手机里那些神秘的内置证书,它们到底是个啥玩意儿?别急,今天就来给你揭秘这些隐藏...
荣耀安装安卓原生系统,深度体验... 你知道吗?最近荣耀手机界可是掀起了一股热潮,那就是——荣耀安装安卓原生系统!这可不是什么小打小闹,而...
安卓13小米系统,创新功能与流... 你知道吗?最近安卓13系统可谓是风头无两,各大手机厂商纷纷推出自家的新版系统,其中小米的安卓13系统...