最大异或对

文章目录

  • Question
  • Ideas
  • Code

Question

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

输入格式
第一行输入一个整数 N

第二行输入 N
个整数 A1
~AN

输出格式
输出一个整数表示答案。

数据范围
1≤N≤105
,
0≤Ai<231
输入样例:
3
1 2 3
输出样例:
3

Ideas

  • 字典树的应用

Code

#include 
#include 

using namespace std;

const int N = 100010, M = 3100010; // 每个数有31位,最多有31*N个节点

int n;
int a[N], son[M][2], idx;

void insert(int x)
{
    int p = 0; // 根节点
    // 从左到右遍历每一位,判断是否存在
    for (int i = 30; i >= 0; i -- )
    {
        int &s = son[p][x >> i & 1]; // x >> i & 1 第i位要么是0要么是1
        if (!s) s = ++ idx; // 如果节点不存在就创建
        p = s;
    }
}

int search(int x)
{
    int p = 0, res = 0; // res存储最大的异或值
    for (int i = 30; i >= 0; i -- )
    {
        int s = x >> i & 1;
        if (son[p][!s]) // 存在与当前位不一样的数,异或得1,当前位变为1
        {
            res += 1 << i;
            p = son[p][!s]; // 继续遍历下一位
        }
        else{
            res += 0 << i;
            p = son[p][s];
        }
    }
    return res;
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d", &a[i]);
        insert(a[i]);
    }

    int res = 0;
    for (int i = 0; i < n; i ++ ) res = max(res, search(a[i]));

    printf("%d\n", res);

    return 0;
}

你可能感兴趣的:(#,算法基础课,算法)