[AcWing]143. 最大异或对 原创

算法标签 Trie字典树贪心

来源 《算法竞赛进阶指南》

题目简叙

在这里插入图片描述

思路

使用二叉树的结构来表示整个插入和查询过程:
在这里插入图片描述

代码

#include<iostream>

using namespace std;
const int N=1e5+10;
int tree[N*31][2];
int idx,p;

void insert(int x){
    p=0;
    for(int i=30;~i;i--){//这里是30的原因是因为限制从0到30,我们采用高位优先,这样可以从大值直接判断
        int u=x>>i&1;//获取当前位置上的二进制数值
        if(!tree[p][u])tree[p][u]=++idx;//如果不存在,则创建,并指向下一个位置
        p = tree[p][u];//移动下一个位置
    }
}

int query(int x){
    p=0;
    int tmpres=0;//用来表示与X异或操作的最大的值
    for(int i=30;~i;i--){
        int u=x>>i&1;
        if(tree[p][!u]){//如果存在和当前U相反的值,就选取,这样数值会更大
            tmpres=tmpres*2+!u;//tmpres为二进制状态,进一位+(!u)
            p =tree[p][!u];//移动到下一个
        }
        else {
            tmpres=tmpres*2+u;
            p =tree[p][u];
        }
    }

    return (tmpres^=x);//两个值进行异或操作
}
    
int main(){
    int n;
    cin>>n;
    
    int tmp;
    int res=0;
    while(n--){
        cin>>tmp;
        insert(tmp);
        res=max(res,query(tmp));//用res维护一个最大值
    }
    
    cout<<res;
    
    return 0;
}

AC记录

在这里插入图片描述

posted @ 2022-07-09 18:06  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源