From fe5fa1141efeb7454c763dbd2645fb4ff04487a3 Mon Sep 17 00:00:00 2001 From: mzuenni Date: Tue, 28 Mar 2023 13:25:59 +0200 Subject: merged --- string/suffixAutomaton.cpp | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) (limited to 'string/suffixAutomaton.cpp') diff --git a/string/suffixAutomaton.cpp b/string/suffixAutomaton.cpp index 8b79822..4cc2a92 100644 --- a/string/suffixAutomaton.cpp +++ b/string/suffixAutomaton.cpp @@ -3,57 +3,57 @@ constexpr char OFFSET = 'a'; struct SuffixAutomaton { struct State { int len, link = -1; - int nxt[ALPHABET_SIZE] = {}; // map if large Alphabet + array next = {}; // map if large Alphabet State(int l) : len(l) {} }; - vector st{0}; - int last = 0; + vector st = {State(0)}; + int cur = 0; - SuffixAutomaton(const string &s) { + SuffixAutomaton(const string& s) { st.reserve(2 * sz(s)); for (auto c : s) extend(c - OFFSET); } void extend(int c) { - st.emplace_back(st[last].len + 1); - int p = last, cur = last = sz(st) - 1; - for (; p != -1 && !st[p].nxt[c]; p = st[p].link) { - st[p].nxt[c] = cur; + int p = cur; + int cur = sz(st); + st.emplace_back(st[p].len + 1); + for (; p != -1 && !st[p].next[c]; p = st[p].link) { + st[p].next[c] = cur; } if (p == -1) st[cur].link = 0; else { - int q = st[p].nxt[c]; + int q = st[p].next[c]; if (st[p].len + 1 == st[q].len) { st[cur].link = q; } else { st.emplace_back(st[p].len + 1); st.back().link = st[q].link; - copy(all(st[q].nxt), st.back().nxt); // back.nxt=[q].nxt - for (; p != -1 && st[p].nxt[c] == q; p = st[p].link) { - st[p].nxt[c] = sz(st) - 1; + st.back().next = st[q].next; + for (; p != -1 && st[p].next[c] == q; p = st[p].link) { + st[p].next[c] = sz(st) - 1; } st[q].link = st[cur].link = sz(st) - 1; - }} - } + }}} vector calculateTerminals() { vector terminals; - for (int p = last; p != -1; p = st[p].link) { + for (int p = cur; p != -1; p = st[p].link) { terminals.push_back(p); } return terminals; } // Pair with start index (in t) and length of LCS. - pair longestCommonSubstring(const string &t) { - int v = 0, l = 0, best = 0, bestpos = 0; + pair longestCommonSubstring(const string& t) { + int v = 0, l = 0, best = 0, bestp = 0; for (int i = 0; i < sz(t); i++) { int c = t[i] - OFFSET; - for (; v && !st[v].nxt[c]; v = st[v].link) l = st[v].len; - if (st[v].nxt[c]) v = st[v].nxt[c], l++; - if (l > best) best = l, bestpos = i; + for (; v && !st[v].next[c]; v = st[v].link) l = st[v].len; + if (st[v].next[c]) v = st[v].next[c], l++; + if (l > best) best = l, bestp = i; } - return {bestpos - best + 1, best}; + return {bestp - best + 1, best}; } }; -- cgit v1.2.3