AcWing143 最大異或和 字典樹

2022-06-28 19:12:12 字數 1005 閱讀 6297

傳送門給出n個整數,選擇兩個整數,使得異或和最大(\(0)

從資料範圍很容易想到二進位制,進而想到字典樹trie。

字典樹的典型應用是儲存字串,儲存二進位制也是一樣的。

我一開始在處理取二進位制位的時候想的比較麻煩,我是使用右移運算子先預處理出每個數的二進位制表示,再根據二進位制表示插入字典樹中。後來了解到x >> i & 1;可以直接取二進位制數的任意一位,這樣簡單了許多。

查詢的時候,先取出對應位的二進位制數,在樹中先走該二進位制數的對立面,如果對立面不存在,再沿著該二進位制數向下走一層。

code:

#include using namespace std;

#define fre freopen("data.in","r",stdin);

#define ms(a) memset((a),0,sizeof(a))

#define go(i,a,b) for(register int (i)=(a);(i)<(b);++(i))

#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);++(i))

#define sf(x) scanf("%d",&(x))

#define reg register

typedef long long ll;

const int inf=(0x3f3f3f3f);

const int maxn=1e5+5;

int a[maxn],son[maxn*31][2],idx;

int n;

inline void insert(int x)

}inline int query(int x)

else

}return ans;

}int main()

int mx=-1;

rep(i,1,n)

printf("%d",mx);

return 0;

}

AcWing 143 最大異或對

題目描述 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式 第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式 輸出乙個整數表示答案。資料範圍 1 n 10 5,0 ai 2 31 輸入樣例 3 1 2 3輸出樣例 3分析 本題要求我們從n個...

Acwing143 最大異或對

用乙個tire樹來存下n個數的二進位制形式的01串,串的長度是31,因為每個數最多為2 31所以,取31,然後根據異或的特性,列舉一下所有的數,取這個數的反碼,去樹中尋找盡可能和反碼向同的路徑,並且記錄下路徑過程的異或值即可 include include include using namespa...

acwing 143 最大異或對

題面 在給定的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 ...