Skip to content

Commit 5d9dc6a

Browse files
authored
feat: add solutions to lc problems: No.2932,2935 (doocs#1961)
* No.2932.Maximum Strong Pair XOR I * No.2935.Maximum Strong Pair XOR II
1 parent 93b348d commit 5d9dc6a

File tree

14 files changed

+1962
-6
lines changed

14 files changed

+1962
-6
lines changed

solution/2900-2999/2932.Maximum Strong Pair XOR I/README.md

+382
Large diffs are not rendered by default.

solution/2900-2999/2932.Maximum Strong Pair XOR I/README_EN.md

+382
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
class Trie {
2+
public:
3+
Trie* children[2];
4+
int cnt;
5+
6+
Trie()
7+
: cnt(0) {
8+
children[0] = nullptr;
9+
children[1] = nullptr;
10+
}
11+
12+
void insert(int x) {
13+
Trie* node = this;
14+
for (int i = 7; ~i; --i) {
15+
int v = (x >> i) & 1;
16+
if (node->children[v] == nullptr) {
17+
node->children[v] = new Trie();
18+
}
19+
node = node->children[v];
20+
++node->cnt;
21+
}
22+
}
23+
24+
int search(int x) {
25+
Trie* node = this;
26+
int ans = 0;
27+
for (int i = 7; ~i; --i) {
28+
int v = (x >> i) & 1;
29+
if (node->children[v ^ 1] != nullptr && node->children[v ^ 1]->cnt > 0) {
30+
ans |= 1 << i;
31+
node = node->children[v ^ 1];
32+
} else {
33+
node = node->children[v];
34+
}
35+
}
36+
return ans;
37+
}
38+
39+
void remove(int x) {
40+
Trie* node = this;
41+
for (int i = 7; ~i; --i) {
42+
int v = (x >> i) & 1;
43+
node = node->children[v];
44+
--node->cnt;
45+
}
46+
}
47+
};
48+
49+
class Solution {
50+
public:
51+
int maximumStrongPairXor(vector<int>& nums) {
52+
sort(nums.begin(), nums.end());
53+
Trie* tree = new Trie();
54+
int ans = 0, i = 0;
55+
for (int y : nums) {
56+
tree->insert(y);
57+
while (y > nums[i] * 2) {
58+
tree->remove(nums[i++]);
59+
}
60+
ans = max(ans, tree->search(y));
61+
}
62+
return ans;
63+
}
64+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
type Trie struct {
2+
children [2]*Trie
3+
cnt int
4+
}
5+
6+
func newTrie() *Trie {
7+
return &Trie{}
8+
}
9+
10+
func (t *Trie) insert(x int) {
11+
node := t
12+
for i := 7; i >= 0; i-- {
13+
v := (x >> uint(i)) & 1
14+
if node.children[v] == nil {
15+
node.children[v] = newTrie()
16+
}
17+
node = node.children[v]
18+
node.cnt++
19+
}
20+
}
21+
22+
func (t *Trie) search(x int) int {
23+
node := t
24+
ans := 0
25+
for i := 7; i >= 0; i-- {
26+
v := (x >> uint(i)) & 1
27+
if node.children[v^1] != nil && node.children[v^1].cnt > 0 {
28+
ans |= 1 << uint(i)
29+
node = node.children[v^1]
30+
} else {
31+
node = node.children[v]
32+
}
33+
}
34+
return ans
35+
}
36+
37+
func (t *Trie) remove(x int) {
38+
node := t
39+
for i := 7; i >= 0; i-- {
40+
v := (x >> uint(i)) & 1
41+
node = node.children[v]
42+
node.cnt--
43+
}
44+
}
45+
46+
func maximumStrongPairXor(nums []int) (ans int) {
47+
sort.Ints(nums)
48+
tree := newTrie()
49+
i := 0
50+
for _, y := range nums {
51+
tree.insert(y)
52+
for ; y > nums[i]*2; i++ {
53+
tree.remove(nums[i])
54+
}
55+
ans = max(ans, tree.search(y))
56+
}
57+
return ans
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class Trie {
2+
private Trie[] children = new Trie[2];
3+
private int cnt = 0;
4+
5+
public Trie() {
6+
}
7+
8+
public void insert(int x) {
9+
Trie node = this;
10+
for (int i = 7; i >= 0; --i) {
11+
int v = x >> i & 1;
12+
if (node.children[v] == null) {
13+
node.children[v] = new Trie();
14+
}
15+
node = node.children[v];
16+
++node.cnt;
17+
}
18+
}
19+
20+
public int search(int x) {
21+
Trie node = this;
22+
int ans = 0;
23+
for (int i = 7; i >= 0; --i) {
24+
int v = x >> i & 1;
25+
if (node.children[v ^ 1] != null && node.children[v ^ 1].cnt > 0) {
26+
ans |= 1 << i;
27+
node = node.children[v ^ 1];
28+
} else {
29+
node = node.children[v];
30+
}
31+
}
32+
return ans;
33+
}
34+
35+
public void remove(int x) {
36+
Trie node = this;
37+
for (int i = 7; i >= 0; --i) {
38+
int v = x >> i & 1;
39+
node = node.children[v];
40+
--node.cnt;
41+
}
42+
}
43+
}
44+
45+
class Solution {
46+
public int maximumStrongPairXor(int[] nums) {
47+
Arrays.sort(nums);
48+
Trie tree = new Trie();
49+
int ans = 0, i = 0;
50+
for (int y : nums) {
51+
tree.insert(y);
52+
while (y > nums[i] * 2) {
53+
tree.remove(nums[i++]);
54+
}
55+
ans = Math.max(ans, tree.search(y));
56+
}
57+
return ans;
58+
}
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class Trie:
2+
__slots__ = ("children", "cnt")
3+
4+
def __init__(self):
5+
self.children: List[Trie | None] = [None, None]
6+
self.cnt = 0
7+
8+
def insert(self, x: int):
9+
node = self
10+
for i in range(7, -1, -1):
11+
v = x >> i & 1
12+
if node.children[v] is None:
13+
node.children[v] = Trie()
14+
node = node.children[v]
15+
node.cnt += 1
16+
17+
def search(self, x: int) -> int:
18+
node = self
19+
ans = 0
20+
for i in range(7, -1, -1):
21+
v = x >> i & 1
22+
if node.children[v ^ 1] and node.children[v ^ 1].cnt:
23+
ans |= 1 << i
24+
node = node.children[v ^ 1]
25+
else:
26+
node = node.children[v]
27+
return ans
28+
29+
def remove(self, x: int):
30+
node = self
31+
for i in range(7, -1, -1):
32+
v = x >> i & 1
33+
node = node.children[v]
34+
node.cnt -= 1
35+
36+
37+
class Solution:
38+
def maximumStrongPairXor(self, nums: List[int]) -> int:
39+
nums.sort()
40+
tree = Trie()
41+
ans = i = 0
42+
for y in nums:
43+
tree.insert(y)
44+
while y > nums[i] * 2:
45+
tree.remove(nums[i])
46+
i += 1
47+
ans = max(ans, tree.search(y))
48+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
class Trie {
2+
children: (Trie | null)[];
3+
cnt: number;
4+
5+
constructor() {
6+
this.children = [null, null];
7+
this.cnt = 0;
8+
}
9+
10+
insert(x: number): void {
11+
let node: Trie | null = this;
12+
for (let i = 7; i >= 0; i--) {
13+
const v = (x >> i) & 1;
14+
if (node.children[v] === null) {
15+
node.children[v] = new Trie();
16+
}
17+
node = node.children[v] as Trie;
18+
node.cnt++;
19+
}
20+
}
21+
22+
search(x: number): number {
23+
let node: Trie | null = this;
24+
let ans = 0;
25+
for (let i = 7; i >= 0; i--) {
26+
const v = (x >> i) & 1;
27+
if (node.children[v ^ 1] !== null && (node.children[v ^ 1] as Trie).cnt > 0) {
28+
ans |= 1 << i;
29+
node = node.children[v ^ 1] as Trie;
30+
} else {
31+
node = node.children[v] as Trie;
32+
}
33+
}
34+
return ans;
35+
}
36+
37+
remove(x: number): void {
38+
let node: Trie | null = this;
39+
for (let i = 7; i >= 0; i--) {
40+
const v = (x >> i) & 1;
41+
node = node.children[v] as Trie;
42+
node.cnt--;
43+
}
44+
}
45+
}
46+
47+
function maximumStrongPairXor(nums: number[]): number {
48+
nums.sort((a, b) => a - b);
49+
const tree = new Trie();
50+
let ans = 0;
51+
let i = 0;
52+
53+
for (const y of nums) {
54+
tree.insert(y);
55+
56+
while (y > nums[i] * 2) {
57+
tree.remove(nums[i++]);
58+
}
59+
60+
ans = Math.max(ans, tree.search(y));
61+
}
62+
63+
return ans;
64+
}

0 commit comments

Comments
 (0)