最大异或对

news2024/9/21 16:34:17

如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~

分析

最大异或对

(1)最大异或对是运用trie树存储十进制数对应的二进制数的每一位
(2)再根据trie树的每一位进行搜索查找,严格满足不同的数异或为1,相同的异或为0。
(3)根据(2)进行搜索,从最高位开始搜索,尽可能地保证较高位次的异或数最大。

通过搜索,匹配每个位最大的异或数。

即从最高位开始,尽可能多地保证每一位的异或数为1,要保证这一点,就需要往当前位数不同的方向走,这样所得到的结果最大。

换句话来说,从最高位开始,往当前位数不同的方向走,如0往1,1往0的方向走,实在无不同位数就走相同位数。

trie结果唯一 及 确保选取两个数

query一个数的时候,这时该数会根据之前插进trie树的每个数的二进制数进行搜索,直至搜到叶子节点结果唯一,那这样就保证我们是选择了两个数去进行异或操作最后得到唯一的最大值。

注意!

理论上,先插入再查找和先查找再插入均可。
但在实现时,考虑到边界问题,即最开始树为空时,查找的边界问题
采用先插入再查找的方式实现,trie数左节点为0,右节点为1

分析图

模拟

在这里插入图片描述

res+=1<<i

在这里插入图片描述

注:把异或数为1的数位左移1相当于2i次方,再把每次枚举的每个位置的结果加起来,就可以得出最大值。

trie树在数组的体现

在这里插入图片描述

ACcode

import java.io.*;
public class Main{
    static int N=3100010;
    //总共是10000个数,每个数枚举对应二进制数的30个位置
    //所以总共是31000010个数
    //数组开小的话为MLE
    static int idx;
    static int son[][]=new int [N][2];
    //一定要记得是0\1两列 p到0和p到1
    public static void insert(int x){
        int p=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;
            if(son[p][u]==0)son[p][u]=++idx;
            p=son[p][u];
        }
    }
    public static int query(int x){
        int p=0,res=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;
            if(son[p][1-u]!=0){
                res+=1<<i;
                p=son[p][1-u];
            }
            else{
                p=son[p][u];
            }
        }
        return res;
    }
    public static void main(String []args)throws IOException{
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
        String str[]=bf.readLine().split(" ");
        int n=Integer.parseInt(str[0]);
        String s[]=bf.readLine().split(" ");
        for(int i=0;i<n;i++)
        {
            insert(Integer.parseInt(s[i]));
        }
        int res=0;
        for(int i=0;i<n;i++){
        int t=query(Integer.parseInt(s[i]));
        res=Math.max(res,t);
    }
    pw.println(res);
    pw.flush();
}
}

详解代码

import java.io.*;
public class Main{
    static int N=3100010;
    static int idx;
    static int son[][]=new int [N][2];
    public static void main(String []args)throws IOException{
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    int n = Integer.parseInt(in.readLine());
    String s[]=in.readLine().split(" ");
    for(int i=0;i<n;i++){
        insert(Integer.parseInt(s[i]));
    }
    int res=0;
    for(int i=0;i<n;i++){
        int t = query(Integer.parseInt(s[i]));
        res=Math.max(res,t);
    }
    out.write(res+" ");
    out.close();
    }
    
    public static void insert(int x){
        int p=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;//取出二进制数的第i位
            if(son[p][u]==0)son[p][u]=++idx;//如果还未被创建,则进行建边操作,连接两个节点,即++idx
            p=son[p][u];//往下一层走
            
        }
    }
    public static int  query(int x){
        int p=0,res=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;
            if(son[p][1-u]!=0){
                //当u=0时,即1-0=1,往1的方向走,异或值最大。
                //son[p][1-u]用来确定1方向的
                //点是否存在,存在则进行下面操作
                //不存在则只能选择唯一的路来走
                
                //当u=1时,即1-1=0,往0的方向走,异或值最大。
                //son[p][1-u]用来确定1方向的点是否存在,存在则进行下面操作
                //不存在则只能选择唯一的路来走
                
                res+= 1<<i;//1<<i = 1 *2的i次方
                //if分支内得到的异或数为1,加上。
                //else分支内得到的异或数为0,不需要加上。
                
                p=son[p][1-u];//以此进入下一层
                
            }
            else{
                //只能选择下面唯一的路来做
                p=son[p][u];
                
            }
        }
        
        return res;
    }
    
    
}

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

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

相关文章

【业余小练习】交互式网格自定义增删改(进行中)

学习SQL和PLISQL数据类型的区别和应用场景 Oracle plsql 基础篇1 数据类型以及流程控制_bb_tarek的博客-CSDN博客https://blog.csdn.net/bb_tarek/article/details/17555713?ops_request_misc&request_id&biz_id102&utm_termplsql%E5%9F%BA%E6%9C%AC%E6%95%B0%E6…

Unlikely argument type for equals(): String seems to be unrelated to T

Unlikely argument type for equals(): String seems to be unrelated to Integer Unlikely argument type for equals(): String seems to be unrelated to Date 多余代码

java代码审计9之XXE

文章目录 1、简介2、 java XXE审计函数3、漏洞3.1、正常的业务3.2、有回显的情况3.3、无回显的情况3.4、修复 之前的文章&#xff0c; php代码审计9之XXE 1、简介 XXE&#xff08;XML外部实体注⼊&#xff0c;XML External Entity) &#xff0c;在应⽤程序解析XML输⼊时&…

【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

linux系统虚拟主机开启支持SourceGuardian(sg11)加密组件

注意&#xff1a;sg11我司只支持linux系统虚拟主机自主安装。支持php5.3及以上版本。 1、登陆主机控制面板&#xff0c;找到【远程文件下载】这个功能。 2、远程下载文件填写http://download.myhostadmin.net/vps/sg11_for_linux.zip 下载保存的路径填写/others/ 3、点击控制…

golang 自定义exporter - 端口连接数 portConnCount_exporter

需求&#xff1a; 1、计算当前6379 、3306 服务的连接数 2、可prometheus 语法查询 下面代码可直接使用&#xff1a; 注&#xff1a; 1、windows 与linux的区分 第38行代码 localAddr : fields[1] //windows为fields[1] &#xff0c; linux为fields[3] 2、如需求 增加/修改/删除…

PHP实现在线进制转换器,10进制,2、4、8、16、32进制转换

1.接口文档 2.laravel实现代码 /*** 进制转换计算器* return \Illuminate\Http\JsonResponse*/public function binaryConvertCal(){$ten $this->request(ten);$two $this->request(two);$four $this->request(four);$eight $this->request(eight);$sixteen …

JavaScript基础 第二天

1. 运算符 2. 语句 一.运算符 1.赋值运算符 2.一元运算符 3.比较运算符 4.逻辑运算符 5.运算符优先级 1.1 赋值运算符 概念&#xff1a;对变量进行赋值的运算符 赋值运算符&#xff1a; - * / % 1.2 一元运算符 可以根据表达式的个数&#xff0c;分为一…

数据结构【第4章】——栈与队列

队列是只允许在一端进行插入操作、而在另-端进行删除操作的线性表。 栈 栈与队列&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09;&…

提升客户满意度的创意项目管理软件推荐!

发现功能强大的工作管理软件&#xff0c;让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板&#xff0c;花更少的时间在管理上&a…

postman如何添加token

参考博客&#xff1a;https://blog.csdn.net/Mrbignose/article/details/107237581 1.添加token&#xff1a; 2.设置token&#xff1a; 3.发送时携带token&#xff1a;

【JavaEE】懒人的福音-MyBatis框架—介绍、搭建环境以及初步感受

【JavaEE】MyBatis框架要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】MyBatis框架要点总结&#xff08;1&#xff09;1. MyBatis是什么&#xff1f;2. 搭建MyBatis的开发环境2.0 MySQL建库建表2.1 新项目添加MyBatis框架2.2 设置MyBatis的配置2.2.1 设置数据库的连接信…

图像的平移变换之c++实现(qt + 不调包)

1.基本原理 设dx为水平偏移量&#xff0c;dy为垂直偏移量&#xff0c;则平移变换的坐标映射关系为下公式&#xff0c;图像平移一般有两种方式。 1.不改变图像大小的平移&#xff08;一旦平移&#xff0c;相应内容被截掉&#xff09; 1&#xff09;当dx > width、dx < -wi…

【云原生】Kubernetes节点亲和性分配 Pod

目录 1 给节点添加标签 2 根据选择节点标签指派 pod 到指定节点[nodeSelector] 3 根据节点名称指派 pod 到指定节点[nodeName] 4 根据 亲和性和反亲和性 指派 pod 到指定节点 5 节点亲和性权重 6 pod 间亲和性和反亲和性及权重 7 污点和容忍度 8 Pod 拓扑分布约束 官方…

flinksql sink to sr often fail because of nullpoint

flinksql or DS sink to starrocks often fail because of nullpoint flink sql 和 flink ds sink starrocks 经常报NullpointException重新编译代码 并上传到flink 集群 验证&#xff0c;有效 flink sql 和 flink ds sink starrocks 经常报NullpointException 使用flink-sta…

【EI复现】售电市场环境下电力用户选择售电公司行为研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AWS——04篇(AWS之Amazon S3(云中可扩展存储)-02——EC2访问S3存储桶)

AWS——04篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-02——EC2访问S3存储桶&#xff09; 1. 前言2. 创建EC2实例 S3存储桶3. 创建IAM角色4. 修改EC2的IAM 角色5. 连接EC2查看效果5.1 连接EC25.2 简单测试5.2.1 查看桶内存储情况5.2.2 复制本地文件…

docker中的jenkins之流水线构建

docker中的jenkins之流水线构建项目 1、用node这种方式&#xff08;因为我用pipeline方式一直不执行&#xff0c;不知道为什么&#xff09; 2、创建项目 创建两个参数&#xff0c;一个是宿主端口号&#xff0c;一个是docker中的端口号 3、使用git项目中的Jenkinsfile 4、编写…

Android安卓实战项目(11)—每个步骤带有动画演示功能的线上运动APP,可计算每日运动卡路里(源码在文末)

Android安卓实战项目&#xff08;11&#xff09;—每个步骤带有动画演示功能的线上运动APP&#xff0c;可计算每日运动卡路里&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 【bilibili演示】 https://www.bilibili.com/video/BV1bk4y1g7Wo/?sh…

Vue day01

Vue 1.简介&#xff1a; ​ Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅容易上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工…