Skip to content

Commit 2ebcb60

Browse files
committed
Suffix Array - Codeforces Education
1 parent 72ebdbe commit 2ebcb60

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

Education/SuffixArray.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#include <bits/stdc++.h>
2+
3+
#define MX 1e4+5
4+
5+
using namespace std;
6+
7+
typedef pair<int, int> pii;
8+
typedef vector<int> vi;
9+
typedef vector<pii> vii;
10+
typedef pair<char, int> pci;
11+
typedef vector<pci> vci;
12+
13+
14+
int main() {
15+
16+
string s;
17+
cin >> s;
18+
19+
s += "$";
20+
int n = s.size();
21+
22+
vi sufInd(n), sufClass(n);
23+
{
24+
vci sufArr(n);
25+
for(int i = 0; i < n; i++)
26+
sufArr[i] = {s[i], i};
27+
sort(sufArr.begin(), sufArr.end());
28+
29+
for(int i = 0; i < n; i++)
30+
sufInd[i] = sufArr[i].second;
31+
32+
sufClass[sufInd[0]] = 0;
33+
for(int i = 1; i < n; i++)
34+
if (sufArr[i].first == sufArr[i-1].first)
35+
sufClass[sufInd[i]] = sufClass[sufInd[i-1]];
36+
else
37+
sufClass[sufInd[i]] = sufClass[sufInd[i-1]] + 1;
38+
}
39+
40+
int k = 0;
41+
while((1 << k) < n) {
42+
vector<pair<pii, int>> sufArr(n);
43+
for(int i = 0; i < n; i++)
44+
sufArr[i] = {{sufClass[i], sufClass[(i + (1 << k)) % n]}, i};
45+
sort(sufArr.begin(), sufArr.end());
46+
47+
for(int i = 0; i < n; i++)
48+
sufInd[i] = sufArr[i].second;
49+
50+
sufClass[sufInd[0]] = 0;
51+
for(int i = 1; i < n; i++)
52+
if (sufArr[i].first == sufArr[i-1].first)
53+
sufClass[sufInd[i]] = sufClass[sufInd[i-1]];
54+
else
55+
sufClass[sufInd[i]] = sufClass[sufInd[i-1]] + 1;
56+
57+
k++;
58+
}
59+
60+
for(int x: sufInd)
61+
cout << x << " ";
62+
cout << "\n";
63+
64+
return 0;
65+
}

0 commit comments

Comments
 (0)