Source code for titan_pylib.string.multi_hash_string

 1from titan_pylib.string.hash_string import HashStringBase, HashString
 2from typing import Optional
 3import random
 4
 5
[docs] 6class MultiHashStringBase: 7 8 def __init__( 9 self, 10 n: int, 11 base_cnt: int = 1, 12 base_list: list[int] = [], 13 seed: Optional[int] = None, 14 ) -> None: 15 if seed is None: 16 seed = random.randint(0, 10**9) 17 assert ( 18 base_cnt > 0 19 ), f"ValueError: {self.__class__.__name__} base_cnt must be > 0" 20 base_list = ( 21 base_list 22 if len(base_list) == base_cnt 23 else [random.randint(37, 10**9) for _ in range(base_cnt)] 24 ) 25 hsb = tuple(HashStringBase(n, base_list[i]) for i in range(base_cnt)) 26 self.hsb = hsb
27 28
[docs] 29class MultiHashString: 30 31 def __init__(self, hsb: MultiHashStringBase, s: str, update: bool = False) -> None: 32 self.hsb = hsb 33 self.hs = tuple(HashString(hsb, s, update=update) for hsb in self.hsb.hsb) 34
[docs] 35 def get(self, l: int, r: int) -> tuple[int]: 36 return tuple(hs.get(l, r) for hs in self.hs)
37 38 def __getitem__(self, k: int) -> tuple[int]: 39 return self.get(k, k + 1) 40
[docs] 41 def set(self, k: int, c: str) -> None: 42 for hs in self.hs: 43 hs.set(k, c)
44 45 def __setitem__(self, k: int, c: str) -> None: 46 self.set(k, c)