Skip to content

Commit 942db5f

Browse files
committed
better automaton + eertree
1 parent 20e9da0 commit 942db5f

4 files changed

Lines changed: 44 additions & 7 deletions

File tree

content/string/eertree.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
constexpr int ALPHABET_SIZE = 26;
2+
constexpr char OFFSET = 'a';
3+
struct Eertree {
4+
struct State {
5+
int len, link = 0, par;
6+
array<int, ALPHABET_SIZE> nxt;
7+
8+
State(int l, int p) : len(l), par(p) {nxt.fill(-1);}
9+
};
10+
11+
vector<State> st = {State(-1, -1), State(0, -1)};
12+
vector<int> s = {-1};
13+
int cur = 0;
14+
Eertree(string& t) {
15+
st.reserve(sz(t) + 2);
16+
for (auto c : t) extend(c - OFFSET);
17+
};
18+
19+
int getLink(int u) {
20+
while (s.end()[-st[u].len - 2] != s.back()) u = st[u].link;
21+
return u;
22+
}
23+
24+
void extend(int c) {
25+
s.push_back(c);
26+
int old = cur = getLink(cur);
27+
if (st[cur].nxt[c] == -1) {
28+
st[cur].nxt[c] = sz(st);
29+
st.emplace_back(st[cur].len + 2, cur);
30+
31+
cur = getLink(st[cur].link);
32+
st.back().link = min(cur + 1, old) ? st[cur].nxt[c] : 1;
33+
}
34+
cur = st[old].nxt[c];
35+
}
36+
};

content/string/string.tex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,6 @@ \section{Strings}
127127
\sourcecode{string/suffixAutomaton.cpp}
128128
\end{algorithm}
129129

130-
\begin{algorithm}{Trie}
131-
\sourcecode{string/trie.cpp}
130+
\begin{algorithm}{Eertree}
131+
\sourcecode{string/eertree.cpp}
132132
\end{algorithm}

content/string/suffixAutomaton.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ constexpr int ALPHABET_SIZE = 26;
22
constexpr char OFFSET = 'a';
33
struct SuffixAutomaton {
44
struct State {
5-
int len, link = -1;
5+
int len, firstPos, link = -1;
6+
bool clone = false;
67
array<int, ALPHABET_SIZE> nxt; // map if large Alphabet
7-
State(int l) : len(l) {fill(all(nxt), -1);}
8+
State(int l) : len(l), firstPos(l) {fill(all(nxt), -1);}
89
};
910

1011
vector<State> st = {State(0)};
@@ -29,9 +30,9 @@ struct SuffixAutomaton {
2930
if (st[p].len + 1 == st[q].len) {
3031
st[cur].link = q;
3132
} else {
32-
st.emplace_back(st[p].len + 1);
33-
st.back().link = st[q].link;
34-
st.back().nxt = st[q].nxt;
33+
st.emplace_back(st[q]);
34+
st.back().len = st[p].len + 1;
35+
st.back().clone = true;
3536
for (; p != -1 && st[p].nxt[c] == q; p = st[p].link) {
3637
st[p].nxt[c] = sz(st) - 1;
3738
}

tcr.pdf

-13.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)