最大異或對

2022-05-07 14:51:08 字數 1356 閱讀 1081

題目傳送:

在給定的n個整數a1,a2……an<?xml:namespace prefix = "[default] " ns = "" />a1,a2……an中選出兩個進行xor(異或)運算,得到的結果最大是多少?

輸入格式

第一行輸入乙個整數n。

第二行輸入n個整數a1a1~anan。

輸出格式

輸出乙個整數表示答案。

資料範圍

1≤n≤1051≤n≤105,

0≤ai<2310≤ai<231

輸入樣例:

3

1 2 3

輸出樣例:
3

暴力是最簡單的解題辦法。這題先拿暴力來寫。
1 #include 2 #include 3

using

namespace std;

4const

int n = 1e6 + 5;

5int a[n];67

int main()

這種方法往往是,會帶來完美的tle。當然優化的方法就要通過觀察,可以通過什麼資料結構將複雜度降下來。

先觀察暴力做法,迴圈的第一次是沒法優化的,觀察第二層迴圈,重複多次求最大值,這顯然不是最優的。

先來了解異或,當兩個二進位制對應位上的值都不相同時就異或值就會最大。

這樣看來我們只需要只找它與列舉的數,的二進位制盡可能相反。在眾多的資料結構中,字典樹可以滿足這個要求。

我們把每位數都當成32位二進位制數,不夠的補0.然後通過策略,每次都取對應位相反的數,否子取相同的。

1 #include 2 #include 3 #include 

4using

namespace std;

5const

int n = 1e5 + 5, m = 31 * n;67

int n;

8int a[n];

9int trie[m][2], tot;

1011

void insert(int x)

19 }

2021

int query(int x)

30else

34 }

35return res;

36 }

3738

int main()

4546

int res = 0;

47for(int i = 0; i < n; ++ i)

50 cout << res << endl;

51return 0;

52 }

最大異或對

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

最大異或對

最大異或對 題解 這題採用的是01字典樹,一般這種異或問題都採用的是01字典樹樹解決。includeusing namespace std const int n 2e6 1 typedef long long ll ll a n int cnt 1 int tree 3 n 2 void inse...

最大異或對

1 對a i 異或 0 1 建立trie陣列。2 從trie數從根開始遍歷,找與a i 相反的數 3 找到當前不一樣的分支,並往前走。1 建trie 2 與輸入二進位制,選擇反方向異或,得到最大值 3 最後返回最大值7。在給定的n個整數a1,a2 ana1,a2 an中選出兩個進行xor 異或 運算...