From c23f6b585f5b351a47da080cbbb0bd3dde897409 Mon Sep 17 00:00:00 2001 From: Ankan Mahapatra <69568975+ankan2526@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:12:35 +0530 Subject: [PATCH 1/3] Create binary_trie.py Useful in Competitive Programming. Contains method to find maximum and minimum XOR value. --- data_structures/trie/binary_trie.py | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 data_structures/trie/binary_trie.py diff --git a/data_structures/trie/binary_trie.py b/data_structures/trie/binary_trie.py new file mode 100644 index 000000000000..2796d97b0bd2 --- /dev/null +++ b/data_structures/trie/binary_trie.py @@ -0,0 +1,65 @@ +class BinaryTrie: + def __init__(self, max_bit_len=31): + self.inf = 1 << 63 + self.cc = [0] + self.to = [[-1], [-1]] + self.mb = max_bit_len + + def add(self, a): + u = 0 + self.cc[u] += 1 + for i in range(self.mb-1, -1, -1): + d = a >> i & 1 + if self.to[d][u] == -1: + self.to[d][u] = len(self.cc) + self.to[0].append(-1) + self.to[1].append(-1) + self.cc.append(0) + u = self.to[d][u] + self.cc[u] += 1 + + def remove(self, a): + if self.cc[0] == 0: return False + uu = [0] + u = 0 + for i in range(self.mb-1, -1, -1): + d = a >> i & 1 + u = self.to[d][u] + if u == -1 or self.cc[u] == 0: return False + uu.append(u) + for u in uu: self.cc[u] -= 1 + return True + + def cnt(self, a): + u = 0 + for i in range(self.mb-1, -1, -1): + d = a >> i & 1 + u = self.to[d][u] + if u == -1 or self.cc[u] == 0: return 0 + return self.cc[u] + + def min_xor(self, a): + if self.cc[0] == 0: return self.inf + u, res = 0, 0 + for i in range(self.mb-1, -1, -1): + d = a >> i & 1 + v = self.to[d][u] + if v == -1 or self.cc[v] == 0: + res |= 1 << i + u = self.to[d ^ 1][u] + else: + u = v + return res + + def max_xor(self, a): + if self.cc[0] == 0: return -self.inf + u, res = 0, 0 + for i in range(self.mb-1, -1, -1): + d = a >> i & 1 + v = self.to[d ^ 1][u] + if v == -1 or self.cc[v] == 0: + u = self.to[d][u] + else: + u = v + res |= 1 << i + return res From 61d3a55474423ce9536ca323299fd4d42a37f71d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:48:59 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/trie/binary_trie.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/data_structures/trie/binary_trie.py b/data_structures/trie/binary_trie.py index 2796d97b0bd2..bf4aae2752e0 100644 --- a/data_structures/trie/binary_trie.py +++ b/data_structures/trie/binary_trie.py @@ -8,7 +8,7 @@ def __init__(self, max_bit_len=31): def add(self, a): u = 0 self.cc[u] += 1 - for i in range(self.mb-1, -1, -1): + for i in range(self.mb - 1, -1, -1): d = a >> i & 1 if self.to[d][u] == -1: self.to[d][u] = len(self.cc) @@ -19,29 +19,34 @@ def add(self, a): self.cc[u] += 1 def remove(self, a): - if self.cc[0] == 0: return False + if self.cc[0] == 0: + return False uu = [0] u = 0 - for i in range(self.mb-1, -1, -1): + for i in range(self.mb - 1, -1, -1): d = a >> i & 1 u = self.to[d][u] - if u == -1 or self.cc[u] == 0: return False + if u == -1 or self.cc[u] == 0: + return False uu.append(u) - for u in uu: self.cc[u] -= 1 + for u in uu: + self.cc[u] -= 1 return True def cnt(self, a): u = 0 - for i in range(self.mb-1, -1, -1): + for i in range(self.mb - 1, -1, -1): d = a >> i & 1 u = self.to[d][u] - if u == -1 or self.cc[u] == 0: return 0 + if u == -1 or self.cc[u] == 0: + return 0 return self.cc[u] def min_xor(self, a): - if self.cc[0] == 0: return self.inf + if self.cc[0] == 0: + return self.inf u, res = 0, 0 - for i in range(self.mb-1, -1, -1): + for i in range(self.mb - 1, -1, -1): d = a >> i & 1 v = self.to[d][u] if v == -1 or self.cc[v] == 0: @@ -52,9 +57,10 @@ def min_xor(self, a): return res def max_xor(self, a): - if self.cc[0] == 0: return -self.inf + if self.cc[0] == 0: + return -self.inf u, res = 0, 0 - for i in range(self.mb-1, -1, -1): + for i in range(self.mb - 1, -1, -1): d = a >> i & 1 v = self.to[d ^ 1][u] if v == -1 or self.cc[v] == 0: From d44b3787e2106b1225bfbec4db9d8808876ca68b Mon Sep 17 00:00:00 2001 From: cclauss Date: Wed, 23 Sep 2026 12:46:37 +0000 Subject: [PATCH 3/3] updating DIRECTORY.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 123f61d1b40b..9b32dd71cbef 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -402,6 +402,7 @@ * Tests * [Test Suffix Tree](data_structures/suffix_tree/tests/test_suffix_tree.py) * Trie + * [Binary Trie](data_structures/trie/binary_trie.py) * [Radix Tree](data_structures/trie/radix_tree.py) * [Trie](data_structures/trie/trie.py)