SuccinctIndexableDictionary

SuccinctIndexableDictionary is a data structure for fast rank queries on a bit vector.

It is commonly used as an internal component of Wavelet Matrix.

Import

import atcoder/extra/structure/succinct_indexable_dictionary

Type

type SuccinctIndexableDictionary

Constructor

proc initSuccinctIndexableDictionary(n: int): SuccinctIndexableDictionary

Creates a length-n bit vector initialized with zeros.

Operations

proc set(sid: var SuccinctIndexableDictionary, k: int)
proc build(sid: var SuccinctIndexableDictionary)

proc rank(sid: SuccinctIndexableDictionary, k: int): int
proc rank(sid: SuccinctIndexableDictionary, bit: bool, k: int): int

Example

var sid = initSuccinctIndexableDictionary(8)sid.set(1)sid.set(3)sid.set(4)sid.build()doAssert sid.rank(0) == 0doAssert sid.rank(4) == 2doAssert sid.rank(8) == 3doAssert sid.rank(true, 8) == 3doAssert sid.rank(false, 8) == 5

Constraints

Calling set after build is not intended.
Set all bits first, then call build.

Complexity