3.7 最大异或对
创始人
2024-05-29 23:51:46
0

异或

二进制位同为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
#includeusing 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<//如果该位置没有可以!的 //那么不用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<

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

相关内容

热门资讯

保温隔音系统门窗安装,打造宁静... 保温隔音系统门窗安装:打造宁静舒适家居环境随着生活品质的提升,人们对家居环境的舒适度要求越来越高。保...
蚌埠市门禁系统安装,打造安全便... 蚌埠市门禁系统安装:打造安全便捷的出入管理新体验随着社会的发展和科技的进步,门禁系统已经成为现代建筑...
斑马系统怎么安装carlife... 斑马系统安装CarLife教程:轻松实现手机与车载系统的无缝连接随着智能手机的普及,越来越多的车主希...
报税系统安装很复杂,揭秘复杂过... 报税系统安装:揭秘复杂过程与注意事项随着电子化报税的普及,越来越多的企业开始使用报税系统进行税务申报...
包头通道闸系统安装,提升城市交... 包头通道闸系统安装:提升城市交通效率的关键举措随着城市化进程的加快,城市交通拥堵问题日益突出。为了有...
安装系统桌面启动失败,原因分析... 安装系统桌面启动失败:原因分析与解决方法在电脑使用过程中,遇到系统桌面启动失败的情况并不少见。这不仅...
保山消防系统安装电话,保山消防... 保山消防系统安装电话——守护您的生活安全随着社会经济的快速发展,人们对生活品质的要求越来越高,消防安...
蚌埠机房灭火系统安装,蚌埠机房... 蚌埠机房灭火系统安装,保障数据中心安全无忧随着信息技术的飞速发展,数据中心已成为企业运营的核心。蚌埠...
驱动安装时被系统阻止,驱动安装... 驱动安装时被系统阻止?教你轻松解决一、驱动安装被系统阻止的原因1. 驱动程序与操作系统不兼容:这是最...
安卓系统怎么进入dos系统安装... 安卓系统如何进入DOS系统进行安装一、准备工作在开始之前,我们需要做一些准备工作,以确保安装过程顺利...
安装系统转换gpt,重装系统m... Windows系统转换GPT分区:详细教程与注意事项一、什么是GPT分区?GPT(GUID Part...
安装专业怎么管理系统,专业安装... 专业安装与管理系统的必要性及方法随着信息技术的飞速发展,管理系统在各个行业中的应用越来越广泛。从企业...
安装自动泊车系统的数据,数据解... 自动泊车系统安装:数据解析与操作指南随着汽车技术的不断发展,自动泊车系统已经成为许多现代汽车的标准配...
北京工厂新风系统安装,提升空气... 北京工厂新风系统安装:提升空气质量,保障员工健康随着工业生产的不断发展,工厂内部空气质量问题日益凸显...
邛崃门禁系统安装价格,邛崃门禁... 邛崃门禁系统安装价格全解析随着社会的发展和科技的进步,门禁系统已经成为现代企事业单位、住宅小区、公共...
白山智能控制系统安装,白山智能... 白山智能控制系统安装指南一、准备工作在开始安装白山智能控制系统之前,请确保您已经做好了以下准备工作:...
驱动安装系统设备,全面指南与常... 驱动安装系统设备:全面指南与常见问题解答随着计算机技术的不断发展,驱动程序在系统设备正常运行中扮演着...
安装系统桌面手机,棰嗙繑欓潰瀮... 随着智能手机的普及,用户对手机系统的个性化需求日益增长。除了系统自带的桌面布局外,许多用户希望通过安...
安装系统怎么选择32位,安装系... 安装系统时如何选择32位操作系统?在电脑系统安装过程中,用户常常面临一个选择:是安装32位操作系统还...
安装系统怎样分配空间,安装系统... 安装系统时如何合理分配硬盘空间一、了解硬盘分区的基本概念在开始分配硬盘空间之前,了解一些基本概念是很...