最大異或對

2022-08-23 10:06:11 字數 1203 閱讀 5099

在給定的n個整數a1,

a2……

an'>a1,a2……an

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

輸入格式

第一行輸入乙個整數n。

第二行輸入n個整數a

1'>a1

a1~a

n'>an

an。輸出格式

輸出乙個整數表示答案。

資料範圍1≤

n≤105

'>1≤n≤105

1≤n≤105,0≤

ai<231

'>0≤ai<231

0≤ai<231

輸入樣例:

3

1 2 3

輸出樣例:
3
我們首先運用暴力將我們的基本思路表達清楚:

#include#includeusing namespace std;

const int n = 100010;

int a[n];

int main()

接下來我們優化這個程式,我們從資料範圍可以看出,時間複雜度應該是在nlogn 或者 o(n)的,所以我們估計只需減少一重迴圈就可以ac掉這個題目。

我們考慮一下第二重迴圈的意義是什麼,然後優化這個**。這個第二重迴圈的作用是:a[i]不變時,遍歷所有a[j],取最大,這時候我們就要想了,是不是有一些過程是沒必要的呢?

我們回顧一下異或運算, 1 ^ 1 = 0 , 0 ^ 0 = 0, 1 ^ 0 = 1,所以我們可以看出,只有二進位制中數不同的才能得到最大值,又多了乙個限制條件意味這我們距離成功又進了一步。

要依次比對的話,就得將我們的數轉化為二進位制儲存,儲存和遍歷字串數值的最高效的方法就是trie演算法。

#include#include

using

namespace

std;

const

int n = 100010, m = 3000010

;int a[n], son[m][2

], idx;

void insert(int x)

}int query(int x)

else p =son[p][s];

}return

res;

}int

main()

熟悉一下tries演算法:

最大異或對

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 異或 運算...