最大異或對(Trie)

2021-10-04 11:50:51 字數 911 閱讀 9610

在給定的n個整數a1,a2……an中選出兩個進行xor(異或)運算,得到的結果最大是多少?

輸入格式

第一行輸入乙個整數n。

第二行輸入n個整數a1~an。

輸出格式

輸出乙個整數表示答案。

資料範圍

1≤n≤105,

0≤ai<2^31

輸入樣例:

3

1 2 3

輸出樣例:

3
思路:

用trie(字典樹),建樹時,根據每個數字的對應的二進位制串構造乙個二叉樹,每個結點兩個分支,分支指向的兩個son結點分別表示當前位的數值為0或1,記錄每次輸入的數字轉化成的二進位制串,當前位為1,就走到數值為1的結點,否則走到0結點,這樣每個數字對應的trie中的路徑就是唯一的。

因為要求異或值最大,所以用貪心的思想,在第乙個數字固定的情況下,盡可能地讓第二個數的每一位都與第乙個數的對應位相反,這樣最終確定的第二個數與第乙個數的異或值就最大,所以在查詢時,遍歷第乙個串o(n),根據固定的第乙個二進位制串,每次盡可能走到與當前位的值相反的結點,這樣的路徑對應的就是與第乙個二進位制串異或值最大的二進位制串,便利了這個數的位數次o(logn),所以總的時間複雜度o(n*logn);

完整**:

#include #include using namespace std;

const int maxn=3e6+5;

int n,a[maxn];

int son[maxn][2],idx;

void insert(int x)

}int query(int x)

int ans=0;

for(int i=0;icout

}

Trie 最大異或對

1 n 1e5,0 ai 2 31 輸入樣例 31 2 3 輸出樣例 3思路 顯然暴力是不能解決問題的,所以我們可以利用異或的性質在第二重迴圈進行優化。我們用trie存一下所有數的值,在遍歷a查詢的時候就在trie上找到和 a i 最接近的數即可。實現 include using namespace...

AcWing 143 最大異或對(Trie)

題目大意 從n個數中選出兩個數異或,求最大的異或值。1 n 105 1 n 10 50 ai 231 0 ai 2 311 n 105 0 a i 231 題解 1 n 105 0 a i 231 首先考慮暴力的寫法 for int i 1 i n i 考慮用資料結構優化,對於每個列舉到的數,找到與...

最大異或對

acwing 143.最大異或對 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式輸出乙個整數表示答案。資料範圍1 n 105,0 ai 231 輸入樣例 3 1 2 3 輸出樣例 題解 異或...