最大異或對

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<iostream>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章