3.7 最大异或对

news2025/7/22 10:36:27

异或

二进制位同为0,异为1
异或符号 ^
异或性质
a^a=0 a^0=0
(a^ b ^c) =(a^c ^b)

一道异或的题目

最大异或对

题目链接

思路

注重思维方式

  1. 首先是暴力想法,使用两重循环,对每两个数字进行取异或运算,得出最大值
  2. 考虑如何优化
  3. 首先,两重for循环的第一层无法优化,因为确实需要至少枚举一次数字。那么考虑优化第二层
  4. 那么这么想,如果给定了一个固定的数字a,我们如何找到另外一个数字b使得 a^b最大。因为异或运算,从二进制角度思考如果我们想让一个数最大,那么这个数的高位应该是1
    在这里插入图片描述
    如上图,对于a=10110,我们要找的b就最好每一位都是a的每一位取!,这样异或出来就是11111,这样就是最大的
  5. 那么第二重循环的目的就是,如何快速找到这样的b。因此我们考虑使用Trie树存储某个数的二进制表示:

    如果我们像这样存储数字,那么在查找时就可以从树根往下找我们想要的!的数字。另一支就根本不用考虑注意,树从上往下应该是从高位到地位,符合贪心的思维,因此可以得到最大值。
  6. 由此可见,思路就很明显了:用Trie树存储所有的数字(二进制从高位到低位存储),然后两层循环,第一层用于遍历所有数值,固定住此时的a。第二层用于搜寻对于a,Trie树中哪一个b使得a^b更大。最后比较每一个a所对应的a ^ b即可。

关于二进制数位的运算在代码中详细解释。详见代码注释。

实现代码


#include<iostream>
#include<algorithm>

using namespace std;

//N用于标注数字的数量,M用于标注节点的数量。
//由于每个数字的范围是0-2^31,因此位数最多31位,最多1e5个数字,节点总数最多为31*1e5约为3*1e6 
const int N=1e5+10,M=3*1e6+1e5;

//定义Trie树,不需要用记录num的数组,因为如果不存在,后面都是0,对于异或运算没影响 
int son[M][2],idx=0;
int a[N];//用于存放数字的数组 

void insert(int x){
	//将x插入Trie树
	
	int p=0;
	for(int i=30;i>=0;i--){
		//这里是30是因为数字范围是0-2^31,int第一位是符号位,这里用不到,后面一共31位,因此从30到0,自己体会 
		int u=(x>>i&1);//提取出x的某一位二进制 
		if(son[p][u]==0)//如果当前位没存
			son[p][u]=++idx; 
		p=son[p][u]; 
	} 
	
}

int search(int x){
	//搜寻能使得和当前x异或最大的数字 
	
	int p=0,res=0;//res是最大的结果值 
	for(int i=30;i>=0;i--){
		int u=(x>>i&1);
		//获得当前x二进制位的数字(从高到低)
		if(son[p][!u]){//如果和该位置 ! (非)存在,注意这里是!
			//那么就按照这条路走,并更新值
			res+=(1<<i); //左移运算嘛,还记得嘛。 
			p=son[p][!u]; 
		}
		else{//如果该位置没有可以!的 
			//那么不用res+=,因为该位结果是0,不需要加
			p=son[p][u];//没办法,只能按照u走,不能按照!u走 
		}
	}
	return res;
} 



int main(){
	
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		insert(a[i]);
	}		
	
	int ans=0;
	
	for(int i=1;i<=n;i++){
		ans=max(ans,search(a[i]));
	}
	
	cout<<ans<<endl;
		
	return 0;
} 

注意
犯了一个很笨比的错误
将!用成了~
!是反转其操作数,用于将0->1, 1->0, 隐式地将true和false转化
而~是按位取反 对于 ~0 ,按位取反后是11111… 值是-1(符号位)
太笨比了,确实数值转化没仔细学过

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

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

相关文章

wireshark 着色规则的含义

文章目录前言wireshark 着色规则的含义前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! wires…

【FATE联邦学习debug】 No module named ‘federatedml‘

直接pip install federatedml是无法找得到这个库的。 这个的原因是环境变量的事情&#xff0c;因为在部署文档中&#xff0c;本身提示我们要更新一些环境变量&#xff0c;如果不export那些变量&#xff0c;下面的fate_test其实也是无法测试成功的。 打开bin/init_env.sh&#x…

活动回顾|龙蜥社区标准化SIG首届MeetUp圆满落幕 《龙蜥社区治理规范》征求意见稿正式发布

2 月 25 日周六&#xff0c;龙蜥社区标准化 SIG 召开首次 MeetUp&#xff0c;会上发布了《龙蜥社区治理规范》征求意见稿&#xff0c;致力于通过标准规范开源社区发展&#xff0c;进而推动操作系统行业的规范发展。&#xff08;图/现场合照&#xff09;本次会议共有来自电子标准…

Espressif-IDE v2.8.0 新增功能及开发方向

在乐鑫最近发布的 Espressif-IDE 2.8.0 版本中&#xff0c;我们推出了分区表编辑器和 NVS 分区编辑器功能&#xff0c;优化现有调试器的配置功能并修复多项 Bug &#xff0c;进一步为用户提升了插件质量以及稳定性。 用户可以点此获取最新版本。 • 若您的设备为 Windows 系统…

Python 插件虚拟环境支持

eKuiper 团队于年前发布了 1.8.0 版本&#xff0c;并在 2 月对该版本的文档进行了完善&#xff0c;同时通过 EMQ Demo Day 直播帮助用户更进一步了解新功能的使用场景。 我们也开始了下一个版本 1.9.0 的开发&#xff0c;该版本将是一个较小的迭代版本&#xff0c;主要目标是实…

矩阵打印问题

文章目录1、题目一&#xff1a;正方形矩阵顺时针转动90度1.1 题目描述1.2 思路分析1.3 代码实现2、题目二&#xff1a;转圈打印长方形矩阵2.1 题目描述2.2 思路分析2.3 代码实现3、题目三&#xff1a;zigzag打印矩阵3.1 题目描述3.2 思路分析3.3 代码实现4、题目四&#xff1a;…

NFS服务器与CGI程序详解

目录 NFS 服务器 一&#xff0c;NFS 服务器简介 二&#xff0c;NFS的使用 三&#xff0c;客户端使用 autofs 自动挂载 1&#xff0c;autofs产生的原因 四&#xff0c;autofs的安装与配置文件 五&#xff0c;autofs的使用 www服务器---cgi程序 CGI程序的应用 NFS 服务器 一&a…

React(六):Redux的使用、react-redux简化代码、redux模块化、RTK的使用

React&#xff08;六&#xff09;一、Redux测试项目搭建1.创建store仓库2.创建reducer函数&#xff08;纯函数&#xff09;3.constants.js保存action名字4.修改store中的数据5.动态生成action二、React中如何使用redux1.安装redux2.创建store3.组件中订阅store4.派发action修改…

运行Hive

Hive的定义&#xff1a;基于Hadoop的数据仓库解决方案将结构化的数据文件映射为数据库表提供类sql的查询语言HQL (Hive Query Language)Hive让更多的人使用hadoopHive的运行机制Hive 通过给用户提供的一系列交互接口&#xff0c;接收到用户的指令(SQL)&#xff0c;使用自己的 D…

LinkedIn最好的辅助工具

领英精灵都有什么功能领英精灵是我国技术人员花巨资针对领英平台研发的辅助工具。具有好友分组、备注&#xff0c;一键批量加好友&#xff0c;批量撤回邀请&#xff0c;批量群发消息&#xff0c;批量导出好友资料&#xff0c;批量点赞六大功能。通过领英精灵可大大提高领英开发…

自建服务器系列- DDNS配置

1、环境说明 光猫桥接路由器拔号的模式 2、DDNS是什么 对于DHCP方式获得的IP&#xff0c;无论对于局域网内来说&#xff0c;还是外网来说&#xff0c;都会有使得IP地址每隔一段时间变化一次&#xff0c;如果想要通过恒定不变的地址访问主机&#xff0c;就需要动态域名解析。…

凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!

2023年2月24日下午&#xff0c;第四届OpenI/O启智开发者大会NLP大模型分论坛在深圳人才研修院隆重举办。该论坛以“开源集智创新探索中文NLP大模型生态发展”为主题&#xff0c;众多业内人士和研发者在此共享NLP领域的前沿动态和研发经验&#xff0c;畅想中国NLP领域的发展前景…

RocketMQ 5.0 学习笔记

1. 需求 背景&#xff1a;业务需要&#xff0c;平台将使用rocketMQ来实现消息的发送与消费&#xff0c;替代redis的消息功能。 需要在搭建好rocketMQ平台后&#xff0c;进行研究和验证。 技术&#xff1a;Springboot RocketMQ5.0 使用场景&#xff1a;签到活动&#xff0c…

DBCO intermidate 3,二苯并环辛炔-四乙酰甘露糖胺一种生化小分子糖标记

DBCO-四乙酰甘露糖胺 &#xff0c;二苯并环辛炔-四乙酰甘露糖胺 | 纯度&#xff1a;95% | DBCO intermidate 31.试剂信息&#xff1a;CAS&#xff1a;N/A外观&#xff1a;固体/粉末分子量&#xff1a;C33H34N2O11分子式&#xff1a;634.64溶解性&#xff1a;溶于有机溶剂&#…

Unity项目优化方案2023

每年整个新活&#xff0c;每年出个手游项目。又到了项目收尾的季节&#xff0c;也是最掉头发的时候。这两周开启漫漫的优化之路。老方法&#xff0c;先按住Ctrl7&#xff0c;打开profiler性能分析工具&#xff0c;找到性能占用的大头。不用看也能猜到&#xff0c;Batches是优化…

JavaEE简单示例——MyBatis的二级缓存机制

简单介绍&#xff1a; 在之前&#xff0c;我们介绍了关于MyBatis的一级缓存机制&#xff0c;之前我们说过&#xff0c;一级缓存是基于SqlSession的对同一条SQL语句多次查询的时候&#xff0c;会将第一次查询的结果缓存到内存中&#xff0c;之后的所有的相同的查询会直接从内存…

修改redis改key值不改过期时间

今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放&#xff0c;用户输入错误次数。 三十秒内输错三次就&#xff0c;等待三十分钟。 那么问题来了&#xff0c;如果说第一次输入错误&#xff0c;应该是 key为用户用&#xff0c;value 为 次数2 ex就为30秒 &…

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 插入排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…

M2E2: Cross-media Structured Common Space for Multimedia Event Extraction 论文解读

Cross-media Structured Common Space for Multimedia Event Extraction 论文&#xff1a;multimediaspace2020.pdf (illinois.edu) 代码&#xff1a;limanling/m2e2: Cross-media Structured Common Space for Multimedia Event Extraction (ACL2020) (github.com) 期刊/会议…

【3D点云】目标检测总结(持续汇总)

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…