library_for_python

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

View the Project on GitHub Kazun1998/library_for_python

:warning: Bitset.py

Code

""" Bitset 説明書
事前に N (Biset のサイズ) と __bit_size (各ブロックごとに収めるサイズ) を決めなくてはいけない.

[おすすめ]
N=10^5, __bit_size=N//k (4<=k<=10)
N=3000, __bit_size=63?

※ count, len を使いたい場合は __bit_size=63 でないと使えない!!!
"""

class Bitset:
    # ※ 事前に設定しておくこと!!!
    N=100
    __bit_size=63*1
    # ここまで

    @staticmethod
    def __popcount(n):
        n -= ((n >> 1) & 0x5555555555555555)
        n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333)
        n = (n + (n >> 4)) & 0x0f0f0f0f0f0f0f0f
        n += ((n >> 8) & 0x00ff00ff00ff00ff)
        n += ((n >> 16) & 0x0000ffff0000ffff)
        n += ((n >> 32) & 0x00000000ffffffff)
        return n & 0x7f

    __block=(N+__bit_size-1)//__bit_size

    __msk_b=(1<<__bit_size)-1
    __msk_s=(1<<(N%__bit_size))-1

    __on=[1<<i for i in range(__bit_size)]
    __off=[0]*__bit_size
    for k in range(__bit_size):
        __off[k]=((1<<__bit_size)-1) ^ (1<<k)
    del k

    def __init__(self):
        self.__bit=[0]*Bitset.__block

    def __len__(self):
        assert Bitset.__bit_size<=63
        x=0
        for bit in self.__bit:
            x+=Bitset.__popcount(bit)
        return x

    def __bool__(self):
        return self.any()

    def __str__(self):
        return " ".join(map(str, [i for i in range(self.N) if i in self]))

    def __repr__(self):
        return "[Bitset] : "+(str(self) if self else "empty")

    def __contains__(self, index):
        k,i=divmod(index, Bitset.__bit_size)
        return bool((self.__bit[k]>>i)&1)

    __getitem__=__contains__

    def __setitem__(self, index, value):
        self.set(index, value)

    def set(self, index=-1, value=1):
        if index==-1:
            if value:
                self.__bit[-1]=Bitset.__msk_s
                for k in range(Bitset.__block-1):
                    self.__bit[k]=Bitset.__msk_b
            else:
                for k in range(Bitset.__block):
                    self.__bit[k]=0
        else:
            k,i=divmod(index, Bitset.__bit_size)
            if value:
                self.__bit[k]|=Bitset.__on[i]
            else:
                self.__bit[k]&=Bitset.__off[i]

    def reset(self, index=-1):
        self.set(index, value=0)

    def flip(self, index=-1):
        if index==-1:
            for k in range(Bitset.__block-1):
                self.__bit[k]=self.__bit[k]^Bitset.__msk_b
            if self.N%Bitset.__bit_size:
                self.__bit[-1]=self.__bit[-1]^Bitset.__msk_s
            else:
                self.__bit[-1]=self.__bit[-1]^Bitset.__msk_b
        else:
            k,i=divmod(index, Bitset.__bit_size)
            self.__bit[k]^=Bitset.__on[i]

    test=__contains__

    def any(self):
        for bit in self.__bit:
            if bit:
                return True
        return False

    def all(self):
        for k in range(Bitset.__block-1):
            if self.__bit[k]!=Bitset.__msk_b:
                return False
        if self.N%Bitset.__bit_size:
            return self.__bit[-1]==Bitset.__msk_s
        else:
            return self.__bit[-1]==Bitset.__msk_b

    def __iand__(self, other):
        for k in range(Bitset.__block):
            self.__bit[k]&=other.__bit[k]
        return self

    def __and__(self, other):
        X=self.copy()
        X&=other
        return X

    def __ior__(self, other):
        for k in range(Bitset.__block):
            self.__bit[k]|=other.__bit[k]
        return self

    def __or__(self, other):
        X=self.copy()
        X|=other
        return X

    def __ixor__(self, other):
        for k in range(Bitset.__block):
            self.__bit[k]^=other.__bit[k]
        return self

    def __xor__(self, other):
        X=self.copy()
        X^=other
        return X

    def __eq__(self, other):
        for k in range(Bitset.__block):
            if self.__bit[k]!=other.__bit[k]:
                return False
        return True

    def __neq__(self, other):
        return not(self==other)

    def copy(self):
        X=Bitset()
        X.__bit=self.__bit.copy()
        return X

    count=__len__
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/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.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page