Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <map>
- #include <set>
- #include <utility>
- namespace state_machine {
- struct StateMachine
- {
- std::string start_state;
- std::set<std::string> states;
- std::set<char> alphabet;
- std::set<std::string> end_states;
- std::map<std::pair<std::string, char>, std::string> functions;
- StateMachine(const std::set<std::string> &states = {},
- const std::set<char> &alphabet = {},
- const std::map<std::pair<std::string, char>, std::string> &functions = {},
- const std::string &start_state = {},
- const std::set<std::string> &end_states = {}
- ) : start_state(start_state),
- states(states),
- alphabet(alphabet),
- end_states(end_states),
- functions(functions) {}
- };
- std::tuple<bool, unsigned, std::string> is_word(const StateMachine &sm, const std::string &s)
- {
- auto curr_state = sm.start_state;
- for (size_t i = 0; i < s.size(); ++i) {
- auto tmp = sm.functions.find(std::pair<std::string, char>{curr_state, s[i]});
- if (tmp != sm.functions.end()) {
- curr_state = tmp->second;
- } else {
- return std::tuple(false, i, curr_state);
- }
- }
- return std::tuple(sm.end_states.find(curr_state) != sm.end_states.end(), s.size(), curr_state);
- }
- }
- int main()
- {
- state_machine::StateMachine sm;
- char c;
- std::string curr, next;
- while (std::cin >> curr && curr != "END") {
- std::cin >> c >> next;
- sm.states.insert(curr);
- sm.states.insert(next);
- sm.alphabet.insert(c);
- sm.functions.insert({std::pair<std::string, char>(curr, c), next});
- }
- while (std::cin >> curr && curr != "END") {
- sm.end_states.insert(curr);
- }
- std::cin >> sm.start_state;
- std::string str;
- std::cin >> str;
- auto ans = state_machine::is_word(sm, str);
- std::cout << std::get<0>(ans) << std::endl << std::get<1>(ans) << std::endl << std::get<2>(ans) << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment