【每日一题】The XOR Largest Pair

The XOR Largest Pair

https://ac.nowcoder.com/acm/problem/50993

Solution

题目要求一对数使得异或值最大。考虑异或运算的特点:按位进行且不进位。可以想到转化为二进制数进行操作,对每一位分别处理。

把每个整数看做长度为 串构建字典树。最低位为字典树的叶子结点。对于数 ,在字典树中检索一次,每次都尝试沿着“与 当前位相反的字符”向下访问。若存在这样的字符指针,令答案加上当前位代表的二进制数即可。由于二进制表示下第 位比第 位到第 位之和都大,所以保证了贪心的正确性。

具体实现时,注意数组大小开 倍。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int ans,n,tot=1,trie[N<<5][2];
void Insert(int x){
    int y,p=1;
    for(int i=31;i>=0;i--){
        y=(x>>i)&1;
        if(!trie[p][y])
            trie[p][y]=++tot;
        p=trie[p][y];
    }
}
int query(int x){
    int y,p=1,res=0;
    for(int i=31;i>=0;i--){
        y=((x>>i)&1)^1;
        if(trie[p][y])
            res+=(1<<i),p=trie[p][y];
        else
            p=trie[p][y^1];
        if(!p)
            break;
    }
    return res;
}
int main(){
    cin>>n;
    int x;
    for(int i=1;i<=n;i++){
        cin>>x;
        ans=max(ans,query(x));
        Insert(x);
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
accaacc:2到4k,不是2k到4k,所以年薪是30块
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务