码迷,mamicode.com
首页 > Windows程序 > 详细

AcWing 143. 最大异或对

时间:2019-11-07 23:19:04      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:algorithm   lse   一个   方向   插入   res   进制   pac   stream   

//先转换成二进制,然后从从高位开始异或

#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. 最大异或对

标签:algorithm   lse   一个   方向   插入   res   进制   pac   stream   

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11816422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!