• 1472:【例题2】The XOR Largest Pair——Trie树


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

    【输入】
    第一行一个整数 N。

    第二行 N 个整数 Ai​​ 。

    【输出】
    一个整数表示答案。

    【输入样例】
    5
    2 9 5 7 0
    【输出样例】
    14
    【提示】
    对于 100% 的数据,1≤N≤105,0≤Ai<2^31​​ 。

    分析

    1. 由于求最大异或和,二进制位相等为0,不同为1,所以我们尽量找他们的对应二进制位不同的个数最多。然后可以通过Trie去构建他们的二进制序列的树;所求最大值二进制也为32位,我们去求他每一位,求满即可;
    2. 每个数都是32位的二进制序列,在query函数中,我们尽量找和当前位u相反的结点son[p][!u]是否存在,存在的话,res的二进制序列整体左移一位然后+1(理解为101然后最后一位多加个1,那就是整体左移一位,也就是乘2,然后再+1);不存在的话,仅仅整体右移一位即可(理解为101然后最后一位多加个0);
    3. x >> i & 1;可以求x的二进制第k位的数
    #include
    
    using namespace std;
    
    const int N = 5e6 + 10;
    int son[N][5];
    int n, x, idx, ans;
    
    void add(int x) {
        int p = 0;
        //从二进制序列第一位开始构建Trie树
        for (int i = 31; i >= 0; --i) {
            int u = x >> i & 1;//求x的二进制第k位的数
            if (son[p][u] == 0)
                son[p][u] = ++idx;
            p = son[p][u];
        }
    }
    
    int query(int x) {
        int res = 0, p = 0;
        for (int i = 31; i >= 0; --i) {
            int u = x >> i & 1;
            if (son[p][!u]) {
                //异或后为1,二进制序列后面加了个1
                res = res * 2 + 1;
                p = son[p][!u];
            } else {
                res = res * 2;
                p = son[p][u];
            }
        }
        return res;
    }
    
    int main() {
        cin.tie(0);
        cin >> n;
        for (int i = 0; i < n; ++i) {
            cin >> x;
            add(x);
            ans = max(ans, query(x));
        }
        cout << ans;
        return 0;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    怎么办理水污染防治资质,水污染防治工程设计专项乙级办理条件有哪些
    云原生爱好者周刊:使用树莓派组建 K8s 集群 | 2022-08-08
    带你从0到1开发AI图像分类应用
    VScode常用快捷键
    uni——判断option传参
    Session会话追踪的实现机制
    【STL编程】【竞赛常用】【part 2】
    第P9周:YOLOv5-Backbone模块实现
    ASAN 内存问题检查工具
    卷积神经网络提取的图像特征包括哪些
  • 原文地址:https://blog.csdn.net/weixin_51995229/article/details/127138469