public: intfindMaximumXOR(vector<int>& nums){ int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { unordered_set<int> seen; // 将所有的 pre^k(a_j) 放入哈希表中 for (int num: nums) { // 如果只想保留从最高位开始到第 k 个二进制位为止的部分 // 只需将其右移 k 位 seen.insert(num >> k); }
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 int x_next = x * 2 + 1; bool found = false; // 枚举 i for (int num: nums) { if (seen.count(x_next ^ (num >> k))) { found = true; break; } }
if (found) { x = x_next; } else { // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 // 即为 x = x*2 x = x_next - 1; } } return x; } };
publicintfindMaximumXOR(int[] nums) { intx=0; for (intk= HIGH_BIT; k >= 0; --k) { Set<Integer> seen = newHashSet<Integer>(); // 将所有的 pre^k(a_j) 放入哈希表中 for (int num : nums) { // 如果只想保留从最高位开始到第 k 个二进制位为止的部分 // 只需将其右移 k 位 seen.add(num >> k); }
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 intxNext= x * 2 + 1; booleanfound=false; // 枚举 i for (int num : nums) { if (seen.contains(xNext ^ (num >> k))) { found = true; break; } }
if (found) { x = xNext; } else { // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 // 即为 x = x*2 x = xNext - 1; } } return x; } }
publicintFindMaximumXOR(int[] nums) { int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { ISet<int> seen = new HashSet<int>(); // 将所有的 pre^k(a_j) 放入哈希表中 foreach (int num in nums) { // 如果只想保留从最高位开始到第 k 个二进制位为止的部分 // 只需将其右移 k 位 seen.Add(num >> k); }
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 int xNext = x * 2 + 1; bool found = false; // 枚举 i foreach (int num in nums) { if (seen.Contains(xNext ^ (num >> k))) { found = true; break; } }
if (found) { x = xNext; } else { // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 // 即为 x = x*2 x = xNext - 1; } } return x; } }
x = 0 for k inrange(HIGH_BIT, -1, -1): seen = set() # 将所有的 pre^k(a_j) 放入哈希表中 for num in nums: # 如果只想保留从最高位开始到第 k 个二进制位为止的部分 # 只需将其右移 k 位 seen.add(num >> k)
# 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 # 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 x_next = x * 2 + 1 found = False # 枚举 i for num in nums: if x_next ^ (num >> k) in seen: found = True break
if found: x = x_next else: # 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 # 即为 x = x*2 x = x_next - 1 return x
var findMaximumXOR = function(nums) { constHIGH_BIT = 30; let x = 0; for (let k = HIGH_BIT; k >= 0; --k) { const seen = newSet(); // 将所有的 pre^k(a_j) 放入哈希表中 for (const num of nums) { // 如果只想保留从最高位开始到第 k 个二进制位为止的部分 // 只需将其右移 k 位 seen.add(num >> k); }
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 const xNext = x * 2 + 1; let found = false; // 枚举 i for (const num of nums) { if (seen.has(xNext ^ (num >> k))) { found = true; break; } }
if (found) { x = xNext; } else { // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 // 即为 x = x*2 x = xNext - 1; } } return x; };
intfindMaximumXOR(int* nums, int numsSize) { int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { structHashTable* hashTable =NULL; // 将所有的 pre^k(a_j) 放入哈希表中 for (int i = 0; i < numsSize; i++) { // 如果只想保留从最高位开始到第 k 个二进制位为止的部分 // 只需将其右移 k 位 int x = nums[i] >> k; structHashTable* tmp; HASH_FIND_INT(hashTable, &x, tmp); if (tmp == NULL) { tmp = malloc(sizeof(struct HashTable)); tmp->key = x; HASH_ADD_INT(hashTable, key, tmp); } }
// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分 // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1 int x_next = x * 2 + 1; bool found = false;
// 枚举 i for (int i = 0; i < numsSize; i++) { int x = x_next ^ (nums[i] >> k); structHashTable* tmp; HASH_FIND_INT(hashTable, &x, tmp); if (tmp != NULL) { found = true; break; } }
if (found) { x = x_next; } else { // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0 // 即为 x = x*2 x = x_next - 1; } } return x; }
public: voidadd(int num){ Trie* cur = root; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { if (!cur->left) { cur->left = newTrie(); } cur = cur->left; } else { if (!cur->right) { cur->right = newTrie(); } cur = cur->right; } } }
intcheck(int num){ Trie* cur = root; int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走 if (cur->right) { cur = cur->right; x = x * 2 + 1; } else { cur = cur->left; x = x * 2; } } else { // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走 if (cur->left) { cur = cur->left; x = x * 2 + 1; } else { cur = cur->right; x = x * 2; } } } return x; }
intfindMaximumXOR(vector<int>& nums){ int n = nums.size(); int x = 0; for (int i = 1; i < n; ++i) { // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中 add(nums[i - 1]); // 将 nums[i] 看作 ai,找出最大的 x 更新答案 x = max(x, check(nums[i])); } return x; } };
publicintFindMaximumXOR(int[] nums) { int n = nums.Length; int x = 0; for (int i = 1; i < n; ++i) { // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中 Add(nums[i - 1]); // 将 nums[i] 看作 ai,找出最大的 x 更新答案 x = Math.Max(x, Check(nums[i])); } return x; }
publicvoidAdd(int num) { Trie cur = root; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { if (cur.left == null) { cur.left = new Trie(); } cur = cur.left; } else { if (cur.right == null) { cur.right = new Trie(); } cur = cur.right; } } }
publicintCheck(int num) { Trie cur = root; int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走 if (cur.right != null) { cur = cur.right; x = x * 2 + 1; } else { cur = cur.left; x = x * 2; } } else { // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走 if (cur.left != null) { cur = cur.left; x = x * 2 + 1; } else { cur = cur.right; x = x * 2; } } } return x; } }
classTrie { // 左子树指向表示 0 的子节点 public Trie left = null; // 右子树指向表示 1 的子节点 public Trie right = null; }
defadd(num: int): cur = root for k inrange(HIGH_BIT, -1, -1): bit = (num >> k) & 1 if bit == 0: ifnot cur.left: cur.left = Trie() cur = cur.left else: ifnot cur.right: cur.right = Trie() cur = cur.right
defcheck(num: int) -> int: cur = root x = 0 for k inrange(HIGH_BIT, -1, -1): bit = (num >> k) & 1 if bit == 0: # a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走 if cur.right: cur = cur.right x = x * 2 + 1 else: cur = cur.left x = x * 2 else: # a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走 if cur.left: cur = cur.left x = x * 2 + 1 else: cur = cur.right x = x * 2 return x
n = len(nums) x = 0 for i inrange(1, n): # 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中 add(nums[i - 1]) # 将 nums[i] 看作 ai,找出最大的 x 更新答案 x = max(x, check(nums[i]))
func(t *trie) add(num int) { cur := t for i := highBit; i >= 0; i-- { bit := num >> i & 1 if bit == 0 { if cur.left == nil { cur.left = &trie{} } cur = cur.left } else { if cur.right == nil { cur.right = &trie{} } cur = cur.right } } }
func(t *trie) check(num int) (x int) { cur := t for i := highBit; i >= 0; i-- { bit := num >> i & 1 if bit == 0 { // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走 if cur.right != nil { cur = cur.right x = x*2 + 1 } else { cur = cur.left x = x * 2 } } else { // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走 if cur.left != nil { cur = cur.left x = x*2 + 1 } else { cur = cur.right x = x * 2 } } } return }
funcfindMaximumXOR(nums []int) (x int) { root := &trie{} for i := 1; i < len(nums); i++ { // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中 root.add(nums[i-1]) // 将 nums[i] 看作 ai,找出最大的 x 更新答案 x = max(x, root.check(nums[i])) } return }
funcmax(a, b int)int { if a > b { return a } return b }
voidadd(struct Trie* root, int num) { structTrie* cur = root; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { if (!cur->left) { cur->left = createTrie(); } cur = cur->left; } else { if (!cur->right) { cur->right = createTrie(); } cur = cur->right; } } }
intcheck(struct Trie* root, int num) { structTrie* cur = root; int x = 0; for (int k = HIGH_BIT; k >= 0; --k) { int bit = (num >> k) & 1; if (bit == 0) { // a_i 的第 k 个二进制位为 0,应当往表示 1 的子节点 right 走 if (cur->right) { cur = cur->right; x = x * 2 + 1; } else { cur = cur->left; x = x * 2; } } else { // a_i 的第 k 个二进制位为 1,应当往表示 0 的子节点 left 走 if (cur->left) { cur = cur->left; x = x * 2 + 1; } else { cur = cur->right; x = x * 2; } } } return x; }
intfindMaximumXOR(int* nums, int numsSize) { structTrie* root = createTrie(); int x = 0; for (int i = 1; i < numsSize; ++i) { // 将 nums[i-1] 放入字典树,此时 nums[0 .. i-1] 都在字典树中 add(root, nums[i - 1]); // 将 nums[i] 看作 ai,找出最大的 x 更新答案 x = fmax(x, check(root, nums[i])); } return x; }