-
Notifications
You must be signed in to change notification settings - Fork 8
/
2935.Maximum Strong Pair XOR II.py
50 lines (43 loc) · 1.26 KB
/
2935.Maximum Strong Pair XOR II.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Solution:
def maximumStrongPairXor(self, nums: List[int]) -> int:
MAX = 1 << 21 - 1
Trie = lambda: defaultdict(Trie)
trie = Trie()
def add(num):
mask = MAX
p = trie
while mask:
p = p[mask & num]
mask >>= 1
p[True] = num
def delete(p, mask, num):
if mask == 0:
del p[True]
return p
bit = mask & num
if not delete(p[bit], mask >> 1, num):
del p[bit]
return p
def get_partner(num):
mask = MAX
p = trie
while mask:
bit = num & mask
if bit ^ mask in p:
p = p[bit ^ mask]
else:
p = p[bit]
mask >>= 1
assert True in p
return p[True]
nums = list(set(nums))
nums.sort()
twice_i = 0
res = 0
for i, num in enumerate(nums):
while twice_i < len(nums) and nums[twice_i] <= 2 * num:
add(nums[twice_i])
twice_i += 1
res = max(res, num ^ get_partner(num))
delete(trie, MAX, num)
return res