文字列s
のa
番目からb-1
番目の要素のsubstring
を、s[a..b)
と表記します。
(1) suffix_array(s)
(2) suffix_array(a)
(3) suffix_array(a, upper)
長さn
の文字列s
に対し、Suffix Arrayとして長さn
のInteger
の配列を返します。
Suffix Array sa
は0 ... n
の順列であって、各i
についてs[sa[i]..n) < s[sa[i+1]..n)
を満たします。
このSuffix Arrayの概念は一般の列にも適用でき、<=>
演算子で比較可能な要素の配列a
に対しても動作します。
suffix_array(s)
内部でs.bytes
によってバイト列に変換します。
制約
s
は文字コード255以下の文字のみからなる文字列
計算量
O(|s|)
suffix_array(a)
内部で、いわゆる座標圧縮を行います。要素は大小関係を保ったまま非負整数に変換されます。
制約
a
の要素は互いに<=>
演算子で比較可能
計算量
要素の比較が定数時間で行えるとして、O(|a| log |a|)
suffix_array(a, upper)
制約
-
a
はInteger
の配列 -
a
の全ての要素x
について0≦x≦upper
計算量
O(|a| + upper)
lcp_array(s, sa)
長さn
の文字列s
のLCP Arrayとして、長さn-1
のInteger
の配列を返します。i
番目の要素はs[sa[i]..n)
とs[sa[i+1]..n)
のLCP ( Longest Common Prefix ) の長さです。
こちらもsuffix_array
と同様一般の列に対して動作します。
制約
-
sa
はs
のSuffix Array -
(
s
が文字列の場合)s
は文字コード255以下の文字のみからなる
計算量
O(|s|)
z_algorithm(s)
入力された配列の長さをn
として、長さn
のInteger
の配列を返します。i
番目の要素はs[0..n)
とs[i..n)
のLCP ( Longest Common Prefix ) の長さです。
制約
s
の要素は互いに==
演算子で比較可能
計算量
O(|s|)
-
suffix_array, lcp_array
-
z_algorithm