@@ -51,39 +51,34 @@ struct TrieNode {
51
51
int minVal = INT_MAX;
52
52
};
53
53
class Solution {
54
+ void add(TrieNode * node, int n) {
55
+ for (int i = 31; i >= 0; --i) {
56
+ int b = n >> i & 1;
57
+ if (node->next[ b] == NULL) node->next[ b] = new TrieNode();
58
+ node = node->next[ b] ;
59
+ node->minVal = min(node->minVal, n);
60
+ }
61
+ }
62
+ int maxXor(TrieNode * node, int x, int m) {
63
+ int ans = 0;
64
+ for (int i = 31; i >= 0; --i) {
65
+ int b = x >> i & 1;
66
+ if (node->next[ 1 - b] && node->next[ 1 - b] ->minVal <= m) {
67
+ node = node->next[ 1 - b] ;
68
+ ans |= 1 << i;
69
+ } else if (node->next[ b] && node->next[ b] ->minVal <= m) node = node->next[ b] ;
70
+ else return -1;
71
+ }
72
+ return ans;
73
+ }
54
74
public:
55
75
vector<int > maximizeXor(vector<int >& A, vector<vector<int >>& Q) {
56
76
TrieNode root;
57
- for (int n : A) {
58
- auto node = &root;
59
- node->minVal = min(node->minVal, n);
60
- for (int i = 31; i >= 0; --i) {
61
- int b = (n >> i) & 1;
62
- if (!node->next[ b] ) node->next[ b] = new TrieNode();
63
- node = node->next[ b] ;
64
- node->minVal = min(node->minVal, n);
65
- }
66
- }
67
77
vector<int > ans;
78
+ for (int n : A) add(&root, n);
68
79
for (auto &q : Q) {
69
- int x = q[ 0] , m = q[ 1] , val = 0;
70
- auto node = &root;
71
- if (node->minVal > m) {
72
- ans.push_back(-1);
73
- continue;
74
- }
75
- for (int i = 31; i >= 0; --i) {
76
- int b = (x >> i) & 1, r = 1 ^ b;
77
- if (node->next[ r] && node->next[ r] ->minVal <= m) {
78
- node = node->next[ r] ;
79
- val |= (1 << i);
80
- } else if (node->next[ b] ->minVal <= m) node = node->next[ b] ;
81
- else {
82
- val = -1;
83
- break;
84
- }
85
- }
86
- ans.push_back(val);
80
+ int x = q[ 0] , m = q[ 1] ;
81
+ ans.push_back(maxXor(&root, x, m));
87
82
}
88
83
return ans;
89
84
}
0 commit comments