Trie樹_CH1602_The XOR Largest Pair
阿新 • • 發佈:2018-11-09
思路分析:
易知, 題目等價於計算i, j, 其中i, j滿足1 =< i < j <= N且異或最大, 對於任意的2 <= x <= N, 考慮計算使得1 <= y < x且異或最大的異或的值, 可將插入一個只含有字元'0'和'1'的Tire樹T中, 其中每個對應一個31位的二進串, 最高位對應字串起始字元. 接下來以對應的二進位制串為依據, 從T的根, 儘量選擇與當前對應字元('0'或'1'相異的分支), 直至到達葉結點, 此葉結點對應的二進位制串即為. 下面給出AC程式碼, 易知, 下述程式的時間複雜度為O(31N).
//CH1602_The XOR Largest Pair #include <cstdio> #include <algorithm> #include <iostream> using namespace std; const int MAX = 31e5 + 5, NIL = (1ll << 31) - 1; int trie[MAX][2], tot; int main(){ int ans = -NIL, N; scanf("%d", &N); for(int i = 1; i <= N; ++i){ int tans = 0, k = 0, t; scanf("%d", &t); for(int j = 30; j >= 0; --j){ int b = t >> j & 1; if(trie[k][!b]) k = trie[k][!b], tans |= 1 << j; else k = trie[k][b]; } ans = max(ans, tans); //將t插入trie中 k = 0; for(int j = 30; j >= 0; --j){ int b = t >> j & 1; if(!trie[k][b]) trie[k][b] = ++tot; k = trie[k][b]; } } printf("%d\n", ans); }