算法(最大异或对)

news2024/10/5 6:29:34

143. 最大异或对​​​​

在给定的 N𝑁 个整数 A1,A2……AN𝐴1,𝐴2……𝐴𝑁 中选出两个进行 xor𝑥𝑜𝑟(异或)运算,得到的结果最大是多少?

输入格式

第一行输入一个整数 N𝑁。

第二行输入 N𝑁 个整数 A1𝐴1~AN𝐴𝑁。

输出格式

输出一个整数表示答案。

数据范围

1≤N≤1051≤𝑁≤105,

思路:

暴力的做法是对于第i个输入的数,分别于前i-1个数异或,得到一个最大值,然后用当前的最大值和ans比较大小,更大的给ans。当i从0到n走一遍以后完成求解,所用时间是o(N*N)。

优化的地方是内层的循环,即每次第i个数不用和前i-1个数都比较一遍,而是可以利用tire树找出其中能得到当前最大异或对的解,具体原理是对于已经存入tire树的前i-1个数,用到大到小遍历第i个数的二进制每一位,看tire数对于当前位,有无相反的那个数(1就是找0,0就是找1),若存在,则最大的异或一定是在这个分支上(因为高位大的一定大),若不存在,则只能选择相同的数,然后继续看下一位,重复上述过程。

注意idx是先加一,再去赋值,要把第0位空出来。开始用++idx出错了,因为若开头位数是0放下标位0的位置,相当于没动。

#include<iostream>
#include<cstring>
using namespace std;

const int N=3000100;
int e[N][2];
int idx;
int n;

void insert(int x)
{   
    int p=0;
    for(int i=30;i>=0;i--)
    {
        int t=x>>i&1;
        if(!e[p][t])e[p][t]=++idx;
        p=e[p][t];
    }
}

int serch(int x)
{   
    int ans=0;
    int p=0;
    for(int i=30;i>=0;i--)
    {
        int t=x>>i&1;
        if(e[p][!t])
        {
            ans=ans*2+1;
            p=e[p][!t];
        }
        else
        {
            p=e[p][t];
            ans*=2;
        }
    }
    return ans;
}

int main()
{   
    scanf("%d",&n);
    int ans=0;
    while(n--)
    {
        int a;
        scanf("%d",&a);
        insert(a);
        ans=max(ans,serch(a));
        
    }
    printf("%d\n",ans);
    return 0;
    
}

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

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

相关文章

力扣 简单 100.相同的树

文章目录 题目介绍解法 题目介绍 解法 采用递归的思想 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(p null || q null){return p q; // 必须都是 null才返回true}return p.val q.val && isSameTree(p.left, q.left) && isSa…

【Qt】控件概述(3)—— 显示类控件

显示类控件 1. QLabel——标签1.1 setPixmap设置图片1.2 setAlignment设置文本对齐方式1.3 setWordWrap设置自动换行1.4 setIndent设置缩进1.5 setMargin设置边距1.6 body 2. QLCDNumber2.1 使用QTimer实现一个倒计时效果2.2 使用循环的方式实现倒计时 3. QProgressBar——进度…

Linux安装AnythingLLM

1. AnythingLLM 简介 AnythingLLM 是 Mintplex Labs 开发的一款可以与任何内容聊天的私人ChatGPT&#xff0c;是高效、可定制、开源的企业级文档聊天机器人解决方案。它能够将任何文档、资源或内容片段转化为大语言模型&#xff08;LLM&#xff09;在聊天中可以利用的相…

【Android】设备操作

本文介绍App开发常用的一些设备操作&#xff0c;主要包括如何使用摄像头进行拍照、如何使用麦克风进行录音并结合摄像头进行录像、如何播放录制好的音频和视频、如何使用常见传感器实现业务功能、如何使用定位功能获取位置信息、如何利用短距离通信技术实现物联网等。 摄像头 …

Armeria gPRC 高级特性 - 装饰器、无框架请求、阻塞处理器、Nacos集成、负载均衡、rpc异常处理、文档服务......

文章目录 定义一个示例高级特性装饰器概述简单案例多种装饰方式 无框架请求概述使用方式 阻塞任务处理器背景概述多种使用方式 rpc 异常统一处理使用方式更详细的异常信息 Armeria 提供 gRPC 客户端多种调用方式同步调用异步调用使用装饰器 负载均衡简单案例Armeria 提供的所有…

5G NR相关笔记

为了提供一致且准确的时序定义&#xff0c;NR规范了一个 基本时间单位 T c 1 / ( 480000 4096 ) , T_c1/(480 000\times 4096), Tc​1/(4800004096),所有与5GNR相关的时间的定义都被描述为这个基本时间单位的整数倍。基本时间单位 T c T_c Tc​ 因此可以看成是子载波间隔480…

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下&#xff1a; pid_t fork(void); 返回值&#xff1a;失败返回-1&#xff0c;成功返回两次&#xff0c;子进程获得0(系统分配)&#xff0c;父进程获得子进程的pid 注意&#xff1a;fork创建子进程&#xff0c;实际上就是将父进程复制一遍作为子进程&…

【AIGC】2023-ICCV-使用 Transformer 的可扩展扩散模型

2023-ICCV-Scalable Diffusion Models with Transformers 使用 Transformer 的可扩展扩散模型摘要1. 引言2. 相关工作3. 扩散 Transformer3.1 准备工作3.2 扩散 Transformer 设计空间 4. 实验设置5. 实验5.1 最先进的扩散模型5.2 缩放模型与采样计算 6. 结论参考文献 使用 Tran…

Ubuntu24.04远程开机

近来在几台机器上鼓捣linux桌面&#xff0c;顺便研究一下远程唤醒主机。 本篇介绍Ubuntu系统的远程唤醒&#xff0c;Windows系统的唤醒可搜索相关资料。 依赖 有远程唤醒功能的路由器&#xff08;当前一般都带这个功能&#xff09;有线连接主机&#xff08;无线连接有兴趣朋友…

PostgreSQL技术内幕13:PostgreSQL通讯协议

文章目录 0.简介1.PG通讯协议1.1 消息格式1.2 消息交互流程1.2.1 启动流程1.2.2 简单查询流程1.2.3 扩展查询1.2.3.1 pipelining 1.2.4 取消流程1.2.5 结束流程1.2.6 copy流程1.2.7 错误和通知 0.简介 之前文章对于PG的内部模块做了一些介绍&#xff0c;接下来对PG和外部交互的…

GS-SLAM论文阅读笔记-MGSO

前言 MGSO首字母缩略词是直接稀疏里程计(DSO)&#xff0c;我们建立的光度SLAM系统和高斯飞溅(GS)的混合。这应该是第一个前端用DSO的高斯SLAM&#xff0c;不知道这个系统的组合能不能打得过ORB-SLAM3&#xff0c;以及对DSO会做出怎么样的改进以适应高斯地图&#xff0c;接下来…

【有啥问啥】SE(Squeeze-and-Excitation)架构详解

SE&#xff08;Squeeze-and-Excitation&#xff09;架构详解 在深度学习&#xff0c;特别是计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;的发展日新月异。为了进一步提升CNN的特征提取能力和模型性能&#xff0c;研究者们不断探索新的网络架构和组件。…

向量数据库|第1期|从零开始学习

向量数据库|第1期|从零开始学习 1、向量数据库中的基本概念 1.1 什么是余弦 余弦函数是一种三角函数&#xff0c;在直角三角形中&#xff0c;某个锐角的余弦为&#xff1a;临边与斜边的比值&#xff0c;如下图cosAb/c。引申到任意三角形中&#xff0c;即余弦定理&#xff1a;…

2024年7月大众点评全国酒吧前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时&#xff0c;大众点评的数据参考价值非常大&#xff0c;截至2024年7月&#xff0c;大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

LSM6DSV16X基于MLC智能笔动作识别(3)----MEMS Studio训练数据

LSM6DSV16X基于MLC智能笔动作识别.3--MEMS Studio训练数据 概述视频教学样品申请源码下载硬件准备选择MEMS导入数据配置窗口长度和量程配置滤波器选择特征数据设备树生成决策树生成参考程序转换UCF文件 概述 MEMS-Studio是一套完整的桌面软件解决方案&#xff0c;专为开发嵌入…

认知杂谈98《抵御噪声干扰》

内容摘要&#xff1a; “能量掠夺”是指他人负面言行对我们情绪和心理状态的不良影响&#xff0c;使我们感到沮丧或愤怒。这种影响可能源于我们内心对自身价值认同的不坚定&#xff0c;以及过分在意他人的看法。 要避免能量掠夺&#xff0c;我们需要建立心理防线&#xff0c;学…

Xilinx Vitis IDE启动时失去响应的解决办法

在启动Xilinx Vitis IDE时&#xff0c;有时候会遇到卡死的情况&#xff0c;无论是直接启动还是从Vivado的菜单中启动都一样。参考Xilinx官网的解决办法&#xff1a;&#xff08;一直到2023.1版本都是可以解决的&#xff0c;之后的版本没测过。&#xff09; Widget (amd.com) …

Leetcode—279. 完全平方数【中等】

2024每日刷题&#xff08;169&#xff09; Leetcode—279. 完全平方数 实现代码 class Solution { public:int numSquares(int n) {vector<int> dp(n 1, n);dp[0] 0;dp[1] 1;for(int i 2; i < n; i) {for(int j 1; j * j < i; j) {dp[i] min(dp[i], dp[i -…

Oracle中ADD_MONTHS()函数详解

文章目录 前言一、ADD_MONTHS()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中&#xff0c;ADD_MONTHS()函数用于在日期中添加指定的月数。 一、ADD_MONTHS()的语法 ADD_MONTHS(date, n) 其中&#xff0c;date是一个日期值&#xff0c;n是一个整数值&#xff0c…

C语言高阶【2】--动态内存管理【2】--柔性数组(这是个全新的知识点,不想了解一下吗?)

本章概述 柔性数组总结C/C中程序内存划分彩蛋时刻&#xff01;&#xff01;&#xff01;&#xff01; 柔性数组 数组这个东西&#xff0c;我想大家应该都不陌生了吧。但是&#xff0c;柔性数组这个东西可能你是第一次听说。 柔性数组概念&#xff1a;在C99之前是没这个东西的…