diff options
| author | Gloria Mundi <gloria@gloria-mundi.eu> | 2024-11-16 01:24:14 +0100 |
|---|---|---|
| committer | Gloria Mundi <gloria@gloria-mundi.eu> | 2024-11-16 01:24:14 +0100 |
| commit | 98567ec798aa8ca2cfbcb85c774dd470f30e30d4 (patch) | |
| tree | 5113d5cc24d1ad5f93810b6442ce584a36950dc8 /string/suffixTree.cpp | |
| parent | ad3856a6b766087df0036de0b556f4700a6498c9 (diff) | |
| parent | 8d11c6c8213f46f0fa19826917c255edd5d43cb1 (diff) | |
mzuenni tests
Diffstat (limited to 'string/suffixTree.cpp')
| -rw-r--r-- | string/suffixTree.cpp | 72 |
1 files changed, 0 insertions, 72 deletions
diff --git a/string/suffixTree.cpp b/string/suffixTree.cpp deleted file mode 100644 index caeeecf..0000000 --- a/string/suffixTree.cpp +++ /dev/null @@ -1,72 +0,0 @@ -struct SuffixTree { - struct Vert { - int start, end, suf; - map<char, int> next; - }; - string s; - int needsSuffix, pos, remainder, curVert, curEdge, curLen; - // Each Vertex gives its children range as [start, end) - vector<Vert> tree = {Vert{-1, -1, 0 {}}}; - - SuffixTree(const string& s) : s(s) { - needsSuffix = remainder = curVert = curEdge = curLen = 0; - pos = -1; - for (int i = 0; i < sz(s); i++) extend(); - } - - int newVert(int start, int end) { - tree.push_back({start, end, 0, {}}); - return sz(tree) - 1; - } - - void addSuffixLink(int vert) { - if (needsSuffix) tree[needsSuffix].suf = vert; - needsSuffix = vert; - } - - bool fullImplicitEdge(int vert) { - len = min(tree[vert].end, pos + 1) - tree[vert].start; - if (curLen >= len) { - curEdge += len; - curLen -= len; - curVert = vert; - return true; - } else { - return false; - }} - - void extend() { - pos++; - needsSuffix = 0; - remainder++; - while (remainder) { - if (curLen == 0) curEdge = pos; - if (!tree[curVert].next.count(s[curEdge])) { - int leaf = newVert(pos, sz(s)); - tree[curVert].next[s[curEdge]] = leaf; - addSuffixLink(curVert); - } else { - int nxt = tree[curVert].next[s[curEdge]]; - if (fullImplicitEdge(nxt)) continue; - if (s[tree[nxt].start + curLen] == s[pos]) { - curLen++; - addSuffixLink(curVert); - break; - } - int split = newVert(tree[nxt].start, - tree[nxt].start + curLen); - tree[curVert].next[s[curEdge]] = split; - int leaf = newVert(pos, sz(s)); - tree[split].next[s[pos]] = leaf; - tree[nxt].start += curLen; - tree[split].next[s[tree[nxt].start]] = nxt; - addSuffixLink(split); - } - remainder--; - if (curVert == 0 && curLen) { - curLen--; - curEdge = pos - remainder + 1; - } else { - curVert = tree[curVert].suf ? tree[curVert].suf : 0; - }}} -};
\ No newline at end of file |
