2525// ! lcp = {1, 3, 0, 0, 2}
2626// !
2727// ! @code
28- // ! string s1;
29- // ! auto [sa, sa_inv, lcp] = get_sa(s1, 256);
30- // ! vi s_vec1;
31- // ! auto [sa1, sa_inv1, lcp1] = get_sa(s_vec1, 100'001);
28+ // ! // requires 0<=s[i]<max_num
29+ // ! string s;
30+ // ! auto [sa, sa_inv, lcp] = get_sa(s, 256);
31+ // ! vi s_vec;
32+ // ! auto [sa1, sa_inv1, lcp1] = get_sa(s_vec, 100'001);
3233// ! @endcode
3334// !
34- // ! requires 0<=s[i]<max_num
35- // !
3635// ! @time O(nlogn + max_num)
3736// ! @space O(n + max_num)
38- template <class T >
37+ template <class T >
3938array<vi, 3 > get_sa (const T& s, int max_num) {
4039 int n = sz (s);
4140 vi sa (n), sa_inv (all (s)), lcp (n - 1 );
@@ -44,7 +43,7 @@ array<vi, 3> get_sa(const T& s, int max_num) {
4443 vi y (sa_inv), freq (max_num);
4544 iota (all (sa_inv), n - i);
4645 ranges::copy_if (sa, begin (sa_inv) + i,
47- [&](int & x) { return (x -= i) >= 0 ; });
46+ [&](int & x) { return (x -= i) >= 0 ; });
4847 for (int x : y) freq[x]++;
4948 partial_sum (all (freq), begin (freq));
5049 for (int x : sa_inv | views::reverse)
0 commit comments