AcWing 143 最大异或对(贪心,trie)

题目链接

解题思路

  如果想要两个异或的值最多,最好就是两个数从二进制的高位到地位,尽可能的满足一个是1一个是0。把每个数都转换成31位二进制串的形式,然后存到trie树中。然后一个一个的枚举每一个数,在trie树中找尽可能可以异或出最大值的数。

代码

const int maxn = 1e5+10;
const int maxm = 3e6+10;
int a[maxn], trie[maxm][2], tot, n;
void insert(int num) {
    int p = 0;
    for (int i = 30; i>=0; --i) {
        int t = num>>i&1;
        if (!trie[p][t]) trie[p][t] = ++tot;
        p = trie[p][t];
    }
}
ll solve(int x) {
    ll res = 0, p = 0;
    for (int i = 30; i>=0; --i) {
        res <<= 1;
        int t = x>>i&1;
        if (trie[p][t^1]) {
            res |= 1;
            p = trie[p][t^1];
        }
        else p = trie[p][t];
    }
    return res;
}
int main() {
    scanf("%d",&n);
    for (int i = 0; i<n; ++i) {
        scanf("%d",&a[i]);
        insert(a[i]);
    }
    ll res = 0;
    for (int i = 0; i<n; ++i) res = max(res,solve(a[i]));
    printf("%lld\n",res);
    return 0;
}
posted @ 2020-07-19 16:24  shuitiangong  阅读(132)  评论(0编辑  收藏  举报