Skip to content

Commit 89abacd

Browse files
committed
edit
1 parent 34be419 commit 89abacd

File tree

4 files changed

+392
-238
lines changed

4 files changed

+392
-238
lines changed

Suffix Automaton/SA.cpp

+92-52
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
3-
The idea of using Treap data structure for storing the transitions
3+
The idea of using Treap data structure for storing the transitions
44
in every Node of the automaton is thanks to Iliyan Yordanov Yordanov
55
66
The construction time complexity of the automaton is guaranteed O(n*log(Sigma)),
@@ -32,7 +32,7 @@ struct Node {
3232
}
3333
};
3434

35-
int numNodes;
35+
int num_nodes;
3636

3737
struct Treap {
3838
private:
@@ -42,6 +42,7 @@ struct Treap {
4242
if (t == -1) {
4343
return void(l = r = -1);
4444
}
45+
4546
if (nodes[t].key < key) {
4647
split(nodes[t].r, nodes[t].r, r, key), l = t;
4748
} else {
@@ -53,6 +54,7 @@ struct Treap {
5354
if (l == -1 || r == -1) {
5455
return void(t = (l == -1 ? r : l));
5556
}
57+
5658
if (nodes[l].prior < nodes[r].prior) {
5759
merge(nodes[r].l, l, nodes[r].l), t = r;
5860
} else {
@@ -63,9 +65,10 @@ struct Treap {
6365
public:
6466
inline void insert(int &t, char key, int state) {
6567
int l, m, r;
68+
6669
split(t, l, r, key);
6770

68-
m = numNodes++;
71+
m = num_nodes++;
6972
nodes[m].set(key, state);
7073

7174
merge(t, l, m);
@@ -74,11 +77,13 @@ struct Treap {
7477

7578
inline void copy(int &cur, int &other) {
7679
if (other != -1) {
77-
cur = numNodes++;
80+
cur = num_nodes++;
7881
nodes[cur] = nodes[other];
82+
7983
if (nodes[other].l != -1) {
8084
copy(nodes[cur].l, nodes[other].l);
8185
}
86+
8287
if (nodes[other].r != -1) {
8388
copy(nodes[cur].r, nodes[other].r);
8489
}
@@ -98,7 +103,7 @@ struct Treap {
98103
}
99104
}
100105

101-
inline vector<Node> &getTreapNodes() {
106+
inline vector<Node> &get_treap_nodes() {
102107
return this->nodes;
103108
};
104109

@@ -117,112 +122,137 @@ struct State {
117122

118123
vector<State> states;
119124
vector<int> transitions;
120-
int numInfix;
125+
int num_infix;
121126

122-
int prefixState(0), last(0);
127+
int prefix_state(0), last(0);
123128

124129
inline void add(char symbol) {
125-
int nq = ++prefixState; // the guaranteed new prefix state
130+
int nq = ++prefix_state; // the guaranteed new prefix state
126131
states[nq].set(states[last].len + 1, -1, nq);
127132
transitions[nq] = -1;
128-
int currTransition, q;
133+
134+
int curr_transition, q;
129135
q = last;
136+
130137
while (q != -1) { // traverse upwards to root
131-
currTransition = T.find(transitions[q], symbol);
132-
if (currTransition != -1) {
138+
curr_transition = T.find(transitions[q], symbol);
139+
140+
if (curr_transition != -1) {
133141
break;
134142
}
135143
T.insert(transitions[q], symbol, nq);
136144
q = states[q].par;
137145
}
146+
138147
last = nq;
148+
139149
if (q == -1) {
140150
return void(states[nq].par = 0);
141151
}
142-
int p = T.getTreapNodes()[currTransition].state;
152+
153+
int p = T.get_treap_nodes()[curr_transition].state;
154+
143155
if (states[q].len + 1 == states[p].len) {
144156
return void(states[nq].par = p);
145157
}
146158

147-
int clone = numInfix++;
159+
int clone = num_infix++;
160+
148161
states[clone].set(states[q].len + 1, states[p].par, states[p].fir);
149162
transitions[clone] = -1;
150163
T.copy(transitions[clone], transitions[p]);
164+
151165
while (q != -1) {
152-
currTransition = T.find(transitions[q], symbol);
153-
if (T.getTreapNodes()[currTransition].state != p) {
166+
curr_transition = T.find(transitions[q], symbol);
167+
168+
if (T.get_treap_nodes()[curr_transition].state != p) {
154169
break;
155170
}
156-
T.getTreapNodes()[currTransition].state = clone;
171+
172+
T.get_treap_nodes()[curr_transition].state = clone;
157173
q = states[q].par;
158174
}
159175
states[p].par = states[nq].par = clone;
160176
}
161177

162-
vector<int> prevEdge;
163-
int cntEdges;
178+
vector<int> prev_edge;
179+
int cnt_edges;
164180

165-
void addEdge(int from, int to = cntEdges) { // to is always equal to cntEdges
166-
prevEdge[to] = transitions[from];
167-
transitions[from] = cntEdges++;
181+
void add_edge(int from, int to = cnt_edges) { // to is always equal to cnt_edges
182+
prev_edge[to] = transitions[from];
183+
transitions[from] = cnt_edges++;
168184
}
169185

170186
vector<int> in, out;
171187
int t;
172188

173189
void dfs(int v) {
174190
in[v] = t++;
175-
for (int to = transitions[v]; to; to = prevEdge[to]) {
191+
192+
for (int to = transitions[v]; to; to = prev_edge[to]) {
176193
dfs(to);
177194
}
195+
178196
out[v] = t++;
179197
}
180198

181-
int cntSquares;
182-
vector<int> lenState;
199+
int cnt_squares;
200+
vector<int> len_state;
201+
202+
void find_squares(int ver) {
203+
len_state[states[ver].len] = ver;
204+
205+
int half = len_state[states[ver].len >> 1];
183206

184-
void findSquares(int ver) {
185-
lenState[states[ver].len] = ver;
186-
int half = lenState[states[ver].len >> 1];
187207
if ((half != -1) && ((states[half].len << 1) == states[ver].len)) {
188208
int ind = states[ver].fir - (states[ver].len >> 1);
209+
189210
if ((in[half] <= in[ind]) && (in[ind] <= out[half])) {
190-
++cntSquares;
211+
++cnt_squares;
191212
}
192213
}
193-
for (int to = transitions[ver]; to; to = prevEdge[to]) {
194-
findSquares(to);
214+
215+
for (int to = transitions[ver]; to; to = prev_edge[to]) {
216+
find_squares(to);
195217
}
196-
lenState[states[ver].len] = -1;
218+
219+
len_state[states[ver].len] = -1;
197220
}
198221

199222
void init(int n) {
200223
states.resize(2 * n);
201-
T.getTreapNodes().resize(3 * n);
202-
numNodes = 0;
224+
T.get_treap_nodes().resize(3 * n);
225+
num_nodes = 0;
226+
203227
transitions.resize(2 * n);
204228
}
205229

206230
int main(int argc, char **argv) {
207231
if (argc != 2) {
208232
printf("Invalid executable file call! Usage: %s <file.txt>\n", argv[0]);
233+
209234
return 1;
210235
}
211-
char *filePath = argv[1];
212-
if (access(filePath, F_OK) < 0 || access(filePath, R_OK) < 0) {
236+
237+
char *file_path = argv[1];
238+
239+
if (access(file_path, F_OK) < 0 || access(file_path, R_OK) < 0) {
213240
printf("Provided file does not exist or is not readable.\n");
214241
return 2;
215242
}
216-
ifstream file(filePath, ios::binary); // treat as a binary file
243+
244+
ifstream file(file_path, ios::binary); // treat as a binary file
217245
file.seekg(-1, ios::end); // seek cursor to end of file with offset -1
246+
218247
int n = file.tellg(); // get length of file
248+
219249
file.seekg(0, ios::beg); // seek back to beginning
220250

221251
init(n);
222252

223253
states[0].set(0, -1, 0);
224254
transitions[0] = -1;
225-
numInfix = n + 1;
255+
num_infix = n + 1;
226256
last = 0;
227257

228258
char c;
@@ -231,35 +261,45 @@ int main(int argc, char **argv) {
231261
while (file.get(c) && isalpha(c)) {
232262
add(c);
233263
}
264+
234265
file.close();
235266

236-
int i, cntFinal = 0, curr = last;
267+
int cnt_final = 0;
268+
int curr = last;
269+
237270
while (curr != -1) {
238-
++cntFinal;
271+
++cnt_final;
239272
curr = states[curr].par;
240273
}
241274

242-
prevEdge.resize(numInfix);
243-
for (i = 0; i < numInfix; ++i) {
275+
prev_edge.resize(num_infix);
276+
277+
for (int i = 0; i < num_infix; ++i) {
244278
transitions[i] = 0;
245279
}
246-
cntEdges = 1;
247-
for (i = 1; i < numInfix; ++i) {
248-
addEdge(states[i].par, i);
280+
281+
cnt_edges = 1;
282+
283+
for (int i = 1; i < num_infix; ++i) {
284+
add_edge(states[i].par, i);
249285
}
250286

251-
in.resize(numInfix);
252-
out.resize(numInfix);
287+
in.resize(num_infix);
288+
out.resize(num_infix);
253289

254290
t = 1;
255291
dfs(0);
256292

257-
lenState.resize(n + 1);
258-
for (i = 0; i < n; ++i) {
259-
lenState[i] = -1;
293+
len_state.resize(n + 1);
294+
295+
for (int i = 0; i < n; ++i) {
296+
len_state[i] = -1;
260297
}
261298

262-
cntSquares = 0;
263-
findSquares(0);
264-
return printf("%d %d %d %d\n", numInfix, numNodes, cntFinal, cntSquares), 0;
299+
cnt_squares = 0;
300+
find_squares(0);
301+
302+
printf("%d %d %d %d\n", num_infix, num_nodes, cnt_final, cnt_squares);
303+
304+
return 0;
265305
}

Treap (Cartesian Tree)/Cartesian Tree Build (stack).cpp

+18-9
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
1-
// github.com/andy489
2-
1+
#include <iostream>
32
#include <vector>
43
#include <stack>
54

65
using namespace std;
76

8-
vector<int> build(int *A, int n) {
7+
vector<int> build(const int *A, int n) {
98
vector<int> parent(n, -1);
109
stack<int> s;
1110

1211
for (int i = 0; i < n; ++i) {
1312
int last = -1;
13+
1414
while (!s.empty() && A[s.top()] >= A[i]) {
1515
last = s.top();
1616
s.pop();
1717
}
18-
if (!s.empty())
18+
19+
if (!s.empty()) {
1920
parent[i] = s.top();
20-
if (last >= 0)
21+
}
22+
23+
if (last >= 0) {
2124
parent[last] = i;
25+
}
26+
2227
s.push(i);
2328
}
2429
return parent;
@@ -36,10 +41,12 @@ void display(int u, vector<vector<int>> &adj) {
3641
int cur = Q.front();
3742
Q.pop();
3843
printf("%d ", cur);
39-
for (const int &child: adj[cur])
44+
for (const int &child: adj[cur]) {
4045
Q.push(child);
46+
}
47+
4148
}
42-
printf("\n");
49+
cout << endl;
4350
}
4451
}
4552

@@ -52,11 +59,13 @@ int main() {
5259
vector<vector<int>> adj(n, vector<int>());
5360

5461
int root = -1;
62+
5563
for (int i = 0; i < n; ++i) {
56-
if (CartesianTree[i] != -1)
64+
if (CartesianTree[i] != -1) {
5765
adj[CartesianTree[i]].push_back(i);
58-
else
66+
} else {
5967
root = i;
68+
}
6069
}
6170

6271
return display(root, adj), 0;

0 commit comments

Comments
 (0)