【練習——trie樹】the xor largest pair
阿新 • • 發佈:2018-10-16
lse lan turn insert 枚舉 trie樹 largest trie 不同的
LOJ #10050. The XOR Largest Pair
trie樹三連擊biu~
《進階指南》P72 例題
思路與上題無異, 只細節不同qaq
- 分解二進制,高位在前, 建立trie樹(0/1)
- search操作:首選不同的(xor值才能大), 就等於在後面加了一個1, 所以 sum = (sum<<1)|1;
- 如果沒有不同的, 就等於在後面加了一個0, 所以 sum = (sum<<1);
- (唔為什麽變紫色了啊啊啊
- 如果從32開始枚舉, 爆int 記得開long long , (gjh:多枚舉幾位, 開個long long保險啊! )這題從31開始也可以, 只要int即可
- 後面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 intid = (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