AcWing 143. 最大异或对

avatar
作者
猴君
阅读量:0

在这里插入图片描述
思路:因为要求XOR最大值,所以两数XOR的时候两数二进制位要是最多的才行,一个数的二进制位是1的同时,另外一个数对应的二进制位是0,这样不一样的二进制位的数量最多时,两数XOR结果最大!

具体操作是先把a[i]以二进制形式插入到Trie树里面,然后Trie查询a【i】,一条路劲沿着a【i】这个二进制路径往深处搜索,从高位搜索,如果当前a【i】里面某一位是0,那么要找到a【i】这路径的对应的1的旁边的一条路径,如果不存在这路径就往下一层搜索,然后遍历a完了之后只花费了 O ( n ) O(n) O(n)时间
在这里插入图片描述

#include<iostream> #define MAX 30000086 #define LEN 100086 using namespace std; int N,a[LEN],son[MAX][2],idx; void insert(int x){     int p=0;     for(int i=30;~i;--i){         int u=(x>>i)&1;//2进制的题意,Trie树只有2种状态,0和1         if(!son[p][u]) son[p][u]=++idx;         p=son[p][u];     } } int query(int  x){     int p=0,res=0;     for(int i=30;~i;--i){//~i等价于i>=0,i==-1是为OxFFFFF,取反之后就是0x0000,         int u=x>>i&1;         if(son[p][!u]){//存在相反2进制位,则把这个数算出来,然后往深一层遍历             res+=1<<i;             p=son[p][!u];         }         else p=son[p][u];//如果不存在相反2进制位,则往深一层遍历     }     return res; } int main(){     cin>>N;     for(int i=0;i<N;i++){         cin>>a[i];         insert(a[i]);     }     int res=0;     for(int i=0;i<N;i++){         res=max(res,query(a[i]));     }     cout<<res<<endl;     return 0; } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!