Source code for titan_pylib.string.get_suffix_array
1from titan_pylib.string.hash_string import HashString
2from titan_pylib.algorithm.sort.merge_sort import merge_sort
3
4
[docs]
5def get_suffix_array(s: str, hs: HashString) -> list[int]:
6 """suffix_arrayを求めます。
7
8 ロリハで大小比較をするため、比較関数に :math:`O(logn)` 、
9 ソートが :math:`O(nlogn*(比較関数の計算量))` で、
10 全体 :math:`O(nlog^2n)` です。
11
12 Args:
13 s (str): 文字列です。
14 hs (HashString): ``HashString`` です。
15
16 Returns:
17 list[int]: suffix_array です。
18 """
19
20 def cmp(u: int, v: int) -> bool:
21 ok, ng = 0, min(n - u, n - v)
22 while ng - ok > 1:
23 mid = (ok + ng) >> 1
24 if hs.get(u, u + mid) == hs.get(v, v + mid):
25 ok = mid
26 else:
27 ng = mid
28 return s[u + ok] < s[v + ok]
29
30 n = len(s)
31 return merge_sort(range(n), key=cmp)