diff --git a/alib2algo/src/stringology/indexing/SuffixTrie.cpp b/alib2algo/src/stringology/indexing/SuffixTrie.cpp index a4f550b70a6569dddbe68b7638b0017039ad6361..2de37e1db2a0365c1ee590fc0732d3b493e9772e 100644 --- a/alib2algo/src/stringology/indexing/SuffixTrie.cpp +++ b/alib2algo/src/stringology/indexing/SuffixTrie.cpp @@ -9,6 +9,7 @@ #include <exception/AlibException.h> #include <string/LinearString.h> +#include <string/LinearStringTerminatingSymbol.h> #include <string/Epsilon.h> #include <alphabet/EndSymbol.h> @@ -31,9 +32,8 @@ indexes::SuffixTrieFinalMark SuffixTrie::construct ( const string::LinearString while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) ) n = & n->getChild ( w.getContent ( )[k++] ); - for ( ; k < w.getContent ( ).size ( ); k++ ) { + for ( ; k < w.getContent ( ).size ( ); k++ ) n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeFinalMark ( { }, false ) ); - } n->setFinalMark ( true ); } @@ -41,27 +41,28 @@ indexes::SuffixTrieFinalMark SuffixTrie::construct ( const string::LinearString return res; } -/*indexes::SuffixTrieTerminatingSymbol SuffixTrie::construct ( const string::TerminatedLinearString & w ) { - * indexes::SuffixTrieTerminatingSymbol res ( w.getAlphabet ( ), w.getTerminatingSymbol() ); - * - * for ( unsigned int i = 0; i < w.getContent ( ).size ( ); i++ ) { - * unsigned int k = i; - * indexes::SuffixTrieNodeTerminatingSymbol * n = & res.getRoot ( ); - * - * // inlined slow_find_one from MI-EVY lectures - * while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) ) - * n = & n->getChild ( w.getContent ( )[k++] ); - * - * for ( ; k < w.getContent ( ).size ( ); k++ ) { - * n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeTerminatingSymbol ( { } ) ); - * } - * } - * - * return res; - * }*/ - auto SuffixTrieLinearString = SuffixTrie::RegistratorWrapper < indexes::SuffixTrieFinalMark, string::LinearString > ( SuffixTrie::getInstance ( ), SuffixTrie::construct ); +indexes::SuffixTrieTerminatingSymbol SuffixTrie::construct ( const string::LinearStringTerminatingSymbol & w ) { + indexes::SuffixTrieTerminatingSymbol res ( w.getAlphabet ( ), w.getTerminatingSymbol ( ) ); + + for ( unsigned int i = 0; i < w.getContent ( ).size ( ); i++ ) { + unsigned int k = i; + indexes::SuffixTrieNodeTerminatingSymbol * n = & res.getRoot ( ); + + // inlined slow_find_one from MI-EVY lectures + while ( k < w.getContent ( ).size ( ) && n->hasChild ( w.getContent ( )[k] ) ) + n = & n->getChild ( w.getContent ( )[k++] ); + + for ( ; k < w.getContent ( ).size ( ); k++ ) + n = & n->addChild ( w.getContent ( )[k], indexes::SuffixTrieNodeTerminatingSymbol ( { } ) ); + } + + return res; +} + +auto SuffixTrieTerminatingSymbolLinearStringTerminatingSymbol = SuffixTrie::RegistratorWrapper < indexes::SuffixTrieTerminatingSymbol, string::LinearStringTerminatingSymbol > ( SuffixTrie::getInstance ( ), SuffixTrie::construct ); + } /* namespace indexing */ } /* namespace stringology */ diff --git a/alib2algo/src/stringology/indexing/SuffixTrie.h b/alib2algo/src/stringology/indexing/SuffixTrie.h index f208afdb686bae185967878881202c8513ff284d..54f95be6c72eb76105d196f5e7cb57ff90200fc1 100644 --- a/alib2algo/src/stringology/indexing/SuffixTrie.h +++ b/alib2algo/src/stringology/indexing/SuffixTrie.h @@ -9,8 +9,10 @@ #define SUFFIX_TRIE_H_ #include <indexes/suffixTrie/SuffixTrieFinalMark.h> +#include <indexes/suffixTrie/SuffixTrieTerminatingSymbol.h> #include <string/String.h> #include <string/LinearString.h> +#include <string/LinearStringTerminatingSymbol.h> #include <common/multipleDispatch.hpp> namespace stringology { @@ -33,6 +35,7 @@ public: static indexes::SuffixTrieFinalMark construct ( const string::String & string ); static indexes::SuffixTrieFinalMark construct ( const string::LinearString & string ); + static indexes::SuffixTrieTerminatingSymbol construct ( const string::LinearStringTerminatingSymbol & string ); public: static SuffixTrie & getInstance ( ) { diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp index c93ba8fd13ee7c1a0dcd101002003afda715c1ed..bf5248d27a264aa4dd4a47500c3a33c31a5cb788 100644 --- a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp +++ b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.cpp @@ -6,6 +6,7 @@ */ #include "SuffixTrieFinalMark.h" +#include "SuffixTrieTerminatingSymbol.h" #include "../../exception/AlibException.h" #include <iostream> @@ -37,6 +38,13 @@ SuffixTrieFinalMark::SuffixTrieFinalMark ( SuffixTrieNodeFinalMark tree ) { setTree ( std::move ( tree ) ); } +SuffixTrieFinalMark::SuffixTrieFinalMark ( const SuffixTrieTerminatingSymbol & other ) { + this->alphabet = other.getAlphabet ( ); + this->alphabet.erase ( other.getTerminatingSymbol ( ) ); + this->tree = NULL; + setTree ( SuffixTrieNodeFinalMark ( other.getRoot ( ), other.getTerminatingSymbol ( ) ) ); +} + SuffixTrieFinalMark::SuffixTrieFinalMark ( const SuffixTrieFinalMark & other ) : tree ( other.tree->clone ( ) ) { alphabet = other.alphabet; this->tree->attachTree ( this ); diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h index 74f676f7bd5baba87bead2f5255cee58c3929c1e..3ac0cd7f2c43e9bf1e4f966eaaebec9d71296176 100644 --- a/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h +++ b/alib2data/src/indexes/suffixTrie/SuffixTrieFinalMark.h @@ -18,6 +18,8 @@ namespace indexes { +class SuffixTrieTerminatingSymbol; + /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of RegExpElement. @@ -41,6 +43,8 @@ public: explicit SuffixTrieFinalMark ( std::set < alphabet::Symbol > alphabet, SuffixTrieNodeFinalMark tree ); explicit SuffixTrieFinalMark ( SuffixTrieNodeFinalMark tree ); + explicit SuffixTrieFinalMark ( const SuffixTrieTerminatingSymbol & tree ); + /** * Copy constructor. * @param other tree to copy diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp index 445ca0eb5b51b5ec7ed1451db13e1f2453fec45b..01fd5b6e3f71ffb616bb02e6d05325001a629b77 100644 --- a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp +++ b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.cpp @@ -6,6 +6,7 @@ */ #include "SuffixTrieNodeFinalMark.h" +#include "SuffixTrieNodeTerminatingSymbol.h" #include "SuffixTrieFinalMark.h" #include "../../exception/AlibException.h" #include <sstream> @@ -20,6 +21,20 @@ SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( std::map < alphabet::Symbol, this->parent = NULL; } +SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( const SuffixTrieNodeTerminatingSymbol & other, const alphabet::Symbol & terminatingSymbol ) : finalMark ( false ), parentTree ( NULL ) { + for ( auto & element : other.getChildren ( ) ) + if ( element.first == terminatingSymbol ) + this->finalMark = true; + else + this->children.insert ( std::make_pair ( element.first, new SuffixTrieNodeFinalMark ( * element.second, terminatingSymbol ) ) ); + + for ( auto & element : this->children ) + element.second->parent = this; + + this->attachTree ( NULL ); + this->parent = NULL; +} + SuffixTrieNodeFinalMark::SuffixTrieNodeFinalMark ( const SuffixTrieNodeFinalMark & other ) : finalMark ( other.finalMark ), parentTree ( NULL ) { for ( const auto & element : other.children ) children.insert ( std::make_pair ( element.first, element.second->clone ( ) ) ); diff --git a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h index 22cea8bad1c55079d1374321a3caf046dbb02350..dedd2259f357f801a9d491ee827c6d012ef0f912 100644 --- a/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h +++ b/alib2data/src/indexes/suffixTrie/SuffixTrieNodeFinalMark.h @@ -16,6 +16,8 @@ namespace indexes { +class SuffixTrieNodeTerminatingSymbol; + /** * Represents a node in the ranked tree. Contains name of the symbol. */ @@ -50,6 +52,8 @@ protected: public: explicit SuffixTrieNodeFinalMark ( std::map < alphabet::Symbol, SuffixTrieNodeFinalMark * > children, bool finalMark ); + explicit SuffixTrieNodeFinalMark ( const SuffixTrieNodeTerminatingSymbol & other, const alphabet::Symbol & terminatingSymbol ); + SuffixTrieNodeFinalMark ( const SuffixTrieNodeFinalMark & other ); SuffixTrieNodeFinalMark ( SuffixTrieNodeFinalMark && other ) noexcept; SuffixTrieNodeFinalMark & operator =( const SuffixTrieNodeFinalMark & other );