The XOR Largest Pair

本文介绍了一种使用Trie树解决在整数数组中寻找两数异或最大值的问题。通过逆向构建Trie树并贪心地选择相反位,确保了结果的最优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 10050. 「一本通 2.3 例 2」The XOR Largest Pair
【题目描述】

在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?

【算法】

trie树经典题目。以每个数字的二进制数串逆向由第31位向第0位建立trie树。用两个指针,一个插入指针插入每一位,一个查询指针贪心的取和当前插入数串的位相反的,若无相反的则只能沿相同的走(保证尽可能高的位尽可能大),注意为保证无论如何能走先插入再查询。(注意:$rec[]$ 数组要置0,查了半天- -)

【代码】
#include <bits/stdc++.h>
using namespace std;
int x,n,tot=1,ans;
int trie[4000100][2],rec[32];
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); }
    return x*f;
}
void parse(int x) {
    memset(rec,0,sizeof(rec));
    for(int i=0;x;x>>=1,i++) rec[i]=x&1;
}
void add(int x) {
    int now=0,p=1,pp=1;
    parse(x);
    for(int i=31;i>=0;i--) {
        if(trie[p][rec[i]]==0) trie[p][rec[i]]=++tot;
        p=trie[p][rec[i]];
        if(trie[pp][!rec[i]]) now<<=1,now++,pp=trie[pp][!rec[i]];
        else pp=trie[pp][rec[i]],now<<=1;
    }
    ans=max(ans,now);
}
int main() {
    n=read();
    for(int i=1;i<=n;i++) {
        x=read();
        add(x);
    }
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/Willendless/p/9623682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值