AcWing 143. 最大异或对
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 143. 最大异或对相关的知识,希望对你有一定的参考价值。
//先转换成二进制,然后从从高位开始异或 #include <iostream> #include <algorithm> using namespace std; const int N = 100010, M = 3000000; int n; int a[N], son[M][2], idx; void insert(int x) { int p = 0; for (int i = 30; i >= 0; i -- ) { int u=x>>i&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>=0; i--) { int u=x>>i&1;//取出最高位 当前位 if(son[p][!u]) { //如果另外一个方向存在 p=son[p][!u]; res=res*2+!u;//相当于把所有数字往左移动一位 } else { p=son[p][u]; res=res*2+u; } } return res; } int main() { cin>>n; for(int i=0; i<n; i++) cin>>a[i]; int res=0; for(int i=0; i<n; i++) { insert(a[i]);//先插入 为了不处理空集的情况 int t=query(a[i]);//再查询 res=max(res,a[i]^t); } cout<<res<<endl; }
以上是关于AcWing 143. 最大异或对的主要内容,如果未能解决你的问题,请参考以下文章