Neterukun's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Neterukun1993/Library

:heavy_check_mark: Binary Trie
(DataStructure/misc/BinaryTrie.py)

概要

Trie 構造で非負整数を管理するデータ構造。

使い方

BinaryTrie(MAX_BIT_LENGTH=32)
空の集合を構築する。集合に格納できる 2 進数での最大桁数を MAX_BIT_LENGTH (これを $\sigma$ とする) で指定する。計算量 $O(1)$

Verified with

Code

class BinaryTrieNode:
    def __init__(self):
        self.bit0 = None
        self.bit1 = None
        self.size = 0


class BinaryTrie:
    def __init__(self, MAX_BIT_LENGTH=32):
        self.MAX_BIT_LENGTH = MAX_BIT_LENGTH
        self.root = BinaryTrieNode()

    def _generate_bit(self, val):
        for i in reversed(range(self.MAX_BIT_LENGTH)):
            yield (val >> i) & 1

    def search(self, val: int) -> bool:
        ptr = self.root
        for bit in self._generate_bit(val):
            if bit:
                ptr = ptr.bit1
            else:
                ptr = ptr.bit0
            if ptr is None:
                return False
        return True

    def insert(self, val: int) -> bool:
        if self.search(val):
            return False
        ptr = self.root
        ptr.size += 1
        for bit in self._generate_bit(val):
            if bit:
                if ptr.bit1 is None:
                    ptr.bit1 = BinaryTrieNode()
                ptr = ptr.bit1
            else:
                if ptr.bit0 is None:
                    ptr.bit0 = BinaryTrieNode()
                ptr = ptr.bit0
            ptr.size += 1
        return True

    def delete(self, val: int) -> bool:
        if not self.search(val):
            return False
        ptr = self.root
        ptr.size -= 1
        for bit in self._generate_bit(val):
            if bit:
                if ptr.bit1.size == 1:
                    ptr.bit1 = None
                    return True
                ptr = ptr.bit1
            else:
                if ptr.bit0.size == 1:
                    ptr.bit0 = None
                    return True
                ptr = ptr.bit0
            ptr.size -= 1
        return True

    def get_xor_min(self, xor_val: int) -> int:
        ptr = self.root
        res = 0
        i = self.MAX_BIT_LENGTH
        for bit in self._generate_bit(xor_val):
            i -= 1
            if bit:
                if ptr.bit1 is not None:
                    ptr = ptr.bit1
                else:
                    ptr = ptr.bit0
                    res |= 1 << i
            else:
                if ptr.bit0 is not None:
                    ptr = ptr.bit0
                else:
                    ptr = ptr.bit1
                    res |= 1 << i
        return res
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page