Suffix array_template

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i, a, b) for (register int i = a; i <= b; i++)
 4 const int maxn = 1010;
 5 int n;
 6 char s[maxn];
 7 int sa[maxn], rk[maxn], height[maxn];
 8 int p[maxn], cnt[maxn], tmp[maxn];
 9 void solve()
10 {
11     rep(i, 1, n)
12     {
13         rk[i] = s[i];
14         sa[i] = i;
15     }
16     for (int l = 0, pos = 0, sig = 255; pos < n; l = l ? l << 1 : 1, sig = pos)
17     {
18         pos = 0;
19         rep(i, n - l + 1, n) p[++pos] = i;
20         rep(i, 1, n) if (sa[i] > l)
21             p[++pos] = sa[i] - l;
22 
23         memset(cnt, 0, sizeof(cnt));
24         rep(i, 1, n) cnt[rk[i]]++;
25         rep(i, 1, sig) cnt[i] += cnt[i - 1];
26         for (int i = n; i; i--)
27             sa[cnt[rk[p[i]]]--] = p[i];
28 
29         pos = 0;
30         rep(i, 1, n) tmp[sa[i]] = rk[sa[i]] == rk[sa[i - 1]] && rk[sa[i] + l] == rk[sa[i - 1] + l] ? pos : ++pos;
31         rep(i, 1, n) rk[i] = tmp[i];
32     }
33     
34     int j, k = 0;
35     rep(i, 1, n)
36     {
37         if (k)
38             k--;
39         j = sa[rk[i] - 1];
40         while (s[i + k] == s[j + k])
41             k++;
42         height[rk[i]] = k;
43     }
44 }
45 int main()
46 {
47     s[0] = 1;
48     cin >> s + 1;
49     n = strlen(s) - 1;
50     solve();
51     for (int i = 1; i <= n; i++)
52         cout << sa[i] << " ";
53     cout << endl;
54     for (int i = 1; i <= n; i++)
55         cout << rk[i] << " ";
56     cout << endl;
57     for (int i = 1; i <= n; i++)
58         cout << height[i] << " ";
59 }

 

Guess you like

Origin www.cnblogs.com/likunhong/p/12732513.html