最大异或对

Acwing->143.最大异或对

题目描述

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

输入格式

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

输出格式

输出一个整数表示答案。

数据范围

1≤N≤105,
0≤Ai<231

输入样例:

3
1 2 3

输出样例:

3

题解:异或+前缀+字典树
其实来说,一个整数,是可以转化成为一个32位的二进制数,而也就可以变成长度为32位的二进制字符串.
既然如此话,那么我们可以这么做,每一次检索的时候,我们都走与当前Ai的二进制位的数值相反的位置走,这样就可以让Xor值最大,如果说没有路可以走的话,那么就走相同的路.
时间复杂度:位数*n,所以是O(32 * n)
代码如下:

#include
using namespace std;
const int N = 1e6 + 10;
int a[N], trie[N * 32][5], idx;
void insert(int x) //建树
{
    int p = 1;
    for(int i = 30; i >= 0; i--){
        int u = x >> i & 1;
        if(!trie[p][u])trie[p][u] = idx++;
        p = trie[p][u];
    }
}
int search(int x)//找最大的
{
    int p = 1, ans = 0;
    for(int i = 30; i >= 0; i--){
        int u = x >> i &1;
        if(trie[p][u^1]){
            p = trie[p][u^1];
            ans +=(1 << i);
        }
        else p = trie[p][u];
    }
    return ans;
}
int main()
{
    int n;
    cin >> n;
    idx =2;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        insert(a[i]);
    }
    int res = 0;
    for(int i = 0; i < n; i++)res = max(res, search(a[i]));
    cout << res << endl;
    return 0;
}

你可能感兴趣的:(数据结构与算法题解总集)