1. 程式人生 > >【練習——trie樹】the xor largest pair

【練習——trie樹】the xor largest pair

lse lan turn insert 枚舉 trie樹 largest trie 不同的

LOJ #10050. The XOR Largest Pair

trie樹三連擊biu~

《進階指南》P72 例題

思路與上題無異, 只細節不同qaq

  1. 分解二進制,高位在前, 建立trie樹(0/1)
  2. search操作:首選不同的(xor值才能大), 就等於在後面加了一個1, 所以 sum = (sum<<1)|1
  3. 如果沒有不同的, 就等於在後面加了一個0, 所以 sum = (sum<<1);
  4. (唔為什麽變紫色了啊啊啊
  5. 如果從32開始枚舉, 爆int 記得開long long , (gjh:多枚舉幾位, 開個long long保險啊! )這題從31開始也可以, 只要int即可
  6. 後面search(a[i]) 寫成search(i) 可還行QAQ

代碼上!

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int sz = 100010;
 5 int n, tot = 0;
 6 int trie[sz*32][2], a[sz];
 7 void insert(int x) {
 8     int root = 0;
 9     for(int i = 31; i >= 0; i--) {
10         int
id = (x>>i)&1; 11 if(!trie[root][id]) trie[root][id] = ++tot; 12 root = trie[root][id]; 13 } 14 } 15 int search(int x) { 16 int root = 0, sum = 0; 17 for(int i = 31; i >= 0; i--) { 18 int id = (x>>i)&1; 19 if(trie[root][id^1]) {
20 root = trie[root][id^1]; 21 sum = (sum<<1)|1; 22 } 23 else { 24 root = trie[root][id]; 25 sum = sum<<1; 26 } 27 } 28 return sum; 29 } 30 int main() { 31 int ans = 0; 32 scanf("%d", &n); 33 for(int i = 1; i <= n; i++) { 34 scanf("%d", &a[i]); 35 insert(a[i]); 36 } 37 for(int i = 1; i <= n; i++) { 38 if(search(a[i])>ans) { 39 ans = search(a[i]); 40 } 41 } 42 printf("%d\n", ans); 43 return 0; 44 }

【練習——trie樹】the xor largest pair