【蓝桥杯集训8】哈希表专题(3 / 3)

news2024/11/30 10:44:58

目录

手写哈希表

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<s.length();i++)
    {
        char t=s.charAt(i);
        res=res*x + t-'0';
    }
    return res;
}
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<s.length;i++)
        {
            res=res*x+s[i]-'0';
        }
        return res;
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        char[] a=sc.next().toCharArray();
        char[] b=sc.next().toCharArray();
        Set<Integer> st=new HashSet<>();
        
        for(int i=0;i<a.length;i++)
        {
            a[i]^=1;
            st.add(get(a,2));
            a[i]^=1;
        }
        
        for(int i=0;i<b.length;i++)
        {
            char t=b[i];
            for(int j=0;j<3;j++) //将这一位换成除了本身的其他数
                if(t-'0'!=j)
                {
                    b[i]=(char)(j+'0');
                    int tp=get(b,3);
                    if(st.contains(tp))
                    {
                        System.out.print(tp);
                        return;
                    }
                }
            b[i]=t; //换完该位要恢复现场 继续换下一位
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TPM 2.0实例探索2 —— LUKS磁盘加密(3)

接前文&#xff1a;TPM 2.0实例探索2 —— LUKS磁盘加密&#xff08;2&#xff09; 本文大部分内容参考&#xff1a; Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 3. 将密码存储于TPM的LUKS 由于自动挂载需要在运行时提供一…

Java中的Stack与Queue

文章目录一、栈的概念及使用1.1 概念1.2 栈的使用1.3 栈的模拟实现二、队列的概念及使用2.1 概念2.2 队列的使用2.3 双端队列(Deque)三、相关OJ题3.1 用队列实现栈。3.2 用栈实现队列。总结一、栈的概念及使用 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在…

【Git】码云

目录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 6.1 创建远程仓库 6.2 远程仓库操作 6.3 SSH 免密登录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 码云网址&#xff1a; https://githee.com/ 账号验证…

【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

干货 | 中小企业选型 Elasticsearch 避坑指南

1、线上常见问题在我线下对接企业或线上交流的时候&#xff0c;经常会遇到各种业务场景不同的问题。比如&#xff0c;常见问题归类如下&#xff1a;常见问题1&#xff1a;ES 适合场景及架构选型问题。公司的核心业务是做企业员工健康管理&#xff0c;数据来自电子化后的员工体检…

【学习总结】相机与IMU标定一:Kalibr论文

论文&#xff1a;2013IROS论文&#xff0c;Unified Temporal and Spatial Calibration for Multi-Sensor Systems&#xff0c;是Kalibr工具的参考论文之一。介绍了如何进行IMU与相机标定。 参考的一篇资料&#xff1a;知乎&#xff1a;超全汇总&#xff01;多传感器离线/在线时…

Java【二叉树】相关知识+基本操作

文章目录前言一、树形结构1.树的定义2.树的概念&#xff08;术语&#xff09;3.树的存储结构二、二叉树1.二叉树的概念两种特殊的二叉树2.二叉树的性质3.二叉树的存储结构4.二叉树的基本操作4.1 二叉树的前序遍历--Preorder Traversal4.2 二叉树的中序遍历--Inorder Traversal4…

Vue项目中如何使用computed计算属性

computed: 1.基本使用 在computed中定义一个函数&#xff08;看起来是一个函数&#xff0c;其实是一个属性&#xff09;&#xff0c;命名按照属性规范命名(一般为名词)。 1.1 应用场景&#xff1a; 当数据A的逻辑很复杂时&#xff0c;把A这个数据写在计算属性里面 1.2 代码位置…

星戈瑞收藏Sulfo-CY7 amine/NHS ester/maleimide小鼠活体成像染料标记反应

关于小鼠活体成像&#xff0c;就一定要提到CY活性染料标记反应&#xff1a; 用不同的活性基团的Cyanine菁染料和相应的活性基团的生物分子或小分子药物发生反应&#xff0c;链接到一起。 根据需要标记的抗原、抗体、酶、多肽等分子所带的可标记基团的种类&#xff08;氨基、醛…

Java中GSON的使用(内含源代码)

Java中GSON的使用&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87474951 目录Java中GSON的使用&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;[https://download.csdn.net/dow…

智能遥测终端机 水文RTU 5G水资源监测 雨水情测报应用

M21F-V50系列智能遥测终端机是辰迈智慧自主研发的融合北斗三代短报文、4/5G公网通信、LoRa、Bluetooth、Ethernet等多种通信方式、数据采集及防盗报警于一体的智能遥测终端。产品内置数据采集器&#xff0c;实现内部模数转换&#xff0c;提供增量式雨量接口、RS232、RS485、以太…

【07-JVM面试专题-JVM运行时数据区的虚拟机栈你知道吗?它的基本结构是什么呢?你知道栈帧的结构吗?那你说说动态链接吧?】

JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态链接吧&#xff1f; JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态…

itk中的一些图像处理

文章目录1.BinomialBlurImageFilter计算每个维度上的最近邻居平均值2.高斯平滑3.图像的高阶导数 RecursiveGaussianImageFilter4.均值滤波5.中值滤波6.离散高斯平滑7.曲率驱动流去噪图像 CurvatureFlowImageFilter8.由参数alpha和beta控制的幂律自适应直方图均衡化9.Canny 边缘…

React hooks之useContext《类比Vue的Provide》(三)

系列文章目录 提示&#xff1a;我又来更新啦&#xff01;&#xff01;&#xff01;这次又把之前useEffect的补充了一次&#xff01;&#xff01;&#xff01;&#xff01; 文章目录系列文章目录前言1.Vue中的Provide和useContext&#xff08;相同点&#xff09;2..Vue中的Provi…

大数据Hadoop教程-学习笔记02【Apache Hadoop、HDFS】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程教程资源&#xff1a;https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【P018-P037】大数据Hadoop教程-学习笔记0…

0301微分中值定理-微分中值定理与导数的应用

文章目录1 罗尔定理2 拉格朗日定理3 柯西中值定理5后记1 罗尔定理 费马引理 设函数f(x)在点x0f(x)在点x_0f(x)在点x0​的某邻域U(x0)U(x_0)U(x0​)内有定义&#xff0c;并且在点x0x_0x0​处可导&#xff0c;如果对任意的x∈U(x0),x\in U(x_0),x∈U(x0​),有 f(x)≤f(x0)(或f(x)…

给你的Vim加上自动编程功能

Vim 是高度可定制、可扩展的编辑器。这对热爱折腾的程序员来说&#xff0c;绝对是一种乐趣&#xff0c;同时也是进一步提升开发效率的源泉。近期CodeGeeX举办的黑客松活动中&#xff0c;参赛选手Lance 提交了一款名叫Vim with CodeGeeX的作品&#xff0c;这款作品是基于CodeGee…

Java开源工具库使用之httpclient

文章目录前言一、简单使用1.1 get 请求1.2 post 简单表单请求1.3 表单上传文件1.4 上传 json 数据二、高级用法2.1 超时和重试2.2 Cookie2.3 拦截器2.4 fluent API三、3.1旧版本使用3.1 Get 请求3.2 Post 请求四、异步版本使用4.1 基本请求4.2 请求流水线执行参考前言 HttpCli…

SSM SpringBoot vue 健康医疗预约系统

SSM SpringBoot vue 健康医疗预约系统 SSM 健康医疗预约系统 功能介绍 首页 图片轮播展示 出诊信息推荐 医院公告 科室信息 科室详情 出诊信息 医生详情 挂号预约 登录注册 留言反馈 个人中心 我的收藏 后台管理 登录 注册医生 个人中心 用户管理 科室信息管理 医生管理 出诊…

二、Java虚拟机的基本结构

Java虚拟机的架构1.内存结果概述2.类加载器子系统的作用3. 类加载器ClassLoader角色4.类的加载过程5.类加载器的分类1.引导类加载器(虚拟机自带的加载器)Bootstrap ClassLoader2.扩展类加载器(虚拟机自带的加载器) Extenssion ClassLoader3.应用程序类加载器(虚拟机自带的加载器…