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)