@@ -8,6 +8,11 @@ struct ranking {
8
8
ll second;
9
9
};
10
10
11
+ // P[i][j] holds the ranking of the j-th suffix
12
+ // after comparing the first 2^i characters
13
+ // of that suffix
14
+ ll P[20 ][1000000 ];
15
+
11
16
bool comp (ranking a, ranking b) {
12
17
if (a.first == b.first ) {
13
18
return a.second < b.second ;
@@ -22,11 +27,6 @@ vector<ll> build_suffix_array(string s) {
22
27
// vector to hold final suffix array result
23
28
vector<ll> sa (n);
24
29
25
- // P[i][j] holds the ranking of the j-th suffix
26
- // after comparing the first 2^i characters
27
- // of that suffix
28
- ll P[lgn][n];
29
-
30
30
// vector to store ranking tuples of suffixes
31
31
vector<ranking> ranks (n);
32
32
@@ -58,12 +58,34 @@ vector<ll> build_suffix_array(string s) {
58
58
return sa;
59
59
}
60
60
61
+ vector<ll> build_lcp (vector<ll> &sa, ll n) {
62
+
63
+ vector<ll> lcp (n,0 );
64
+ ll k, i, j , x, delta, step = ceil (log2 (n));
65
+ for (k = 1 ; k < n; k++) {
66
+ i = k;
67
+ j = k - 1 ;
68
+ for (x = step; x >= 0 ; x--) {
69
+ if (P[x][sa[i]] == P[x][sa[j]]) {
70
+ delta = pow (2 ,x);
71
+ lcp[i] += delta;
72
+ i += delta;
73
+ j += delta;
74
+ }
75
+ }
76
+ }
77
+ return lcp;
78
+ }
79
+
61
80
int main () {
62
81
string s;
82
+ ll i, n, m, ans;
63
83
cin >> s;
84
+ n = s.length ();
64
85
vector<ll> sa = build_suffix_array (s);
65
- for (ll i = 0 ; i < s.length (); i++) {
66
- cout << i << " : " << sa[i] << endl;
86
+ vector<ll> lcp = build_lcp (sa,n);
87
+ for (ll i = 0 ; i < n; i++) {
88
+ cout << i << " : " << sa[i] << " : " << s.substr (sa[i]) << " : " << lcp[i] << endl;
67
89
}
68
90
return 0 ;
69
91
}
0 commit comments