Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
ExactCoversComputation.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <string/LinearString.h>
9#include <automaton/FSM/NFA.h>
11
12namespace stringology::cover {
13
15public:
23 template < class SymbolType >
25};
26
27template < class SymbolType >
29
31
32 ext::set < unsigned > previousState ( { suffixNDA.getInitialState ( ) } );
33 ext::vector < SymbolType > inputString = pattern.getContent ( );
34
37
38 for ( const SymbolType & symbol : inputString ) {
39 cover.push_back ( symbol );
40
41 ext::set < unsigned > newState;
42 for ( unsigned nfaState : previousState ) {
43 auto transition_range = suffixNDA.getTransitions ( ).equal_range ( ext::make_pair ( nfaState, symbol ) );
44 for ( const auto & it : transition_range ) {
45 newState.insert ( it.second );
46 }
47 }
48
49 previousState = newState;
50
51 if ( newState.size ( ) < 2 )
52 break;
53
54 // if last element fulfills the condition (L17), then check all neighboring elements. We iterate backwards in order to save some iterator repositioning for the last element.
55 if ( * newState.rbegin ( ) == inputString.size ( ) ) { // safe (at least 2 elements)
56 bool isCover = true;
57 auto it = std::next ( newState.rbegin ( ) );
58 auto prev = newState.rbegin ( );
59
60 for ( ; it != newState.rend ( ); ++ it, ++ prev ) {
61 if ( *prev - *it > cover.size ( ) ) {
62 isCover = false;
63 break;
64 }
65 }
66
67 if ( isCover )
69 }
70 }
71
72 return result;
73}
74
75} /* namespace stringology::cover */
76
Nondeterministic finite automaton. Accepts regular languages.
Definition: NFA.h:66
const StateType & getInitialState() const &
Definition: NFA.h:107
const ext::multimap< ext::pair< StateType, SymbolType >, StateType > & getTransitions() const &
Definition: NFA.h:484
Definition: set.hpp:44
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Linear string.
Definition: LinearString.h:57
const ext::vector< SymbolType > & getContent() const &
Definition: LinearString.h:238
Definition: ExactCoversComputation.h:14
static ext::set< string::LinearString< SymbolType > > compute(const string::LinearString< SymbolType > &pattern)
Definition: ExactCoversComputation.h:28
static automaton::NFA< SymbolType, unsigned > construct(const string::LinearString< SymbolType > &pattern)
Definition: NondeterministicExactSuffixAutomaton.h:31
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: ApproximateCoversComputation.cpp:9