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(符号位)
太笨比了,确实数值转化没仔细学过

相关内容

热门资讯

安卓系统目前哪个最好,探索当前... 你有没有想过,手机里的安卓系统就像是一群各具特色的英雄,每个都有自己独特的技能和魅力。那么,问题来了...
安卓系统怎么把图标锁上,图标锁... 手机里的图标乱糟糟的,是不是也想给它们来个“小锁”,让它们乖乖待在原地呢?别急,今天就来教你怎么把安...
微软换账号注册安卓系统,安卓系... 你有没有想过,有一天你的安卓手机突然焕然一新,仿佛重获新生?这可不是普通的升级,而是因为微软的账号注...
怎么停止安卓系统更新,轻松关闭... 手机更新又来了!是不是每次安卓系统更新,你的手机都像被施了魔法,速度变慢,电池续航也跟着缩水?别急,...
股票买平板还是安卓系统,股票投... 最近是不是也被手机屏幕的诱惑给勾住了?想换一台新平板,但又纠结是买苹果的iPad还是安卓系统的平板呢...
iso系统比安卓安全,超越安卓... 你知道吗?在手机操作系统这个江湖里,ISO系统和安卓系统可是两大门派,各有所长。但今天,我要给你揭秘...
安卓手机系统排名图片,揭秘市场... 你有没有发现,现在安卓手机市场上,各种品牌的手机层出不穷,让人眼花缭乱?今天,就让我带你一起走进这个...
安卓系统手机没电图片,电量耗尽... 手机没电了,这可是个让人头疼的小麻烦呢!想象你正沉浸在追剧的乐趣中,突然屏幕一黑,手机没电了。这时候...
安卓系统温控模块在哪里,核心功... 你有没有遇到过手机发热的情况,是不是觉得手机就像个小暖炉,让你有点招架不住呢?别急,今天就来给你揭秘...
最流畅的安卓原生系统,探索安卓... 你有没有想过,为什么你的手机用起来有时候那么卡,有时候又那么流畅呢?这背后,其实隐藏着一个秘密——那...
安卓系统可以刷windows吗... 你有没有想过,你的安卓手机或者平板,竟然能变身成一台Windows电脑?是的,你没听错,安卓系统是可...
苹果安卓操作系统,全面对比与深... 你有没有想过,为什么你的手机里装了那么多应用,而别人的手机却看起来那么清爽?这背后,其实就是苹果的i...
安卓tv中文系统,功能解析与使... 你有没有发现,家里的安卓TV最近变得超级智能呢?没错,就是那个曾经只能看看视频、玩玩游戏的小家伙,现...
谷歌安卓10系统打不开,原因排... 最近是不是你也遇到了这个让人头疼的问题:谷歌安卓10系统打不开?别急,让我来帮你一步步排查,找出原因...
安卓系统转苹果吃鸡,体验全新i... 你知道吗?最近身边的小伙伴们都在热议一个话题:从安卓系统转到苹果手机,体验吃鸡游戏的新鲜感。这可不是...
双系统d盘安装安卓,轻松实现手... 你有没有想过,在电脑上同时拥有Windows系统和安卓系统,是不是就像拥有了两个世界的大门呢?想象一...
安卓系统后台运行程序,高效运行... 你有没有发现,手机里的安卓系统后台运行程序有时候就像那些调皮的小精灵,悄无声息地在你不知道的时候忙碌...
苹果ipad如何改安卓系统,轻... 你有没有想过,把你的苹果iPad换成安卓系统,是不是会有一种全新的使用体验呢?想象那些你熟悉的安卓应...
安卓隐藏系统状态栏,安卓隐藏系... 你有没有发现,手机屏幕下方那个小小的状态栏,有时候真的挺碍眼的?尤其是当你沉浸在游戏或者追剧的时候,...
bb10系统安装安卓,轻松实现... 你有没有想过,把那老式的BB10系统升级成安卓,让它焕发第二春呢?想象你的老手机瞬间变成了一个功能强...