vlad7576

up09-6 (DFA emulator)

May 17th, 2020
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <set>
  5. #include <utility>
  6.  
  7.  
  8. namespace state_machine {
  9.     struct StateMachine
  10.     {
  11.         std::string start_state;
  12.         std::set<std::string> states;
  13.         std::set<char> alphabet;
  14.         std::set<std::string> end_states;
  15.         std::map<std::pair<std::string, char>, std::string> functions;
  16.  
  17.         StateMachine(const std::set<std::string> &states = {},
  18.                         const std::set<char> &alphabet = {},
  19.                         const std::map<std::pair<std::string, char>, std::string> &functions = {},
  20.                         const std::string &start_state = {},
  21.                         const std::set<std::string> &end_states = {}
  22.         ) : start_state(start_state),
  23.             states(states),
  24.             alphabet(alphabet),
  25.             end_states(end_states),
  26.             functions(functions) {}
  27.     };
  28.  
  29.     std::tuple<bool, unsigned, std::string> is_word(const StateMachine &sm, const std::string &s)
  30.     {
  31.         auto curr_state = sm.start_state;
  32.         for (size_t i = 0; i < s.size(); ++i) {
  33.             auto tmp = sm.functions.find(std::pair<std::string, char>{curr_state, s[i]});
  34.             if (tmp != sm.functions.end()) {
  35.                 curr_state = tmp->second;
  36.             } else {
  37.                 return std::tuple(false, i, curr_state);
  38.             }
  39.         }
  40.  
  41.         return std::tuple(sm.end_states.find(curr_state) != sm.end_states.end(), s.size(), curr_state);
  42.     }
  43. }
  44.  
  45. int main()
  46. {
  47.     state_machine::StateMachine sm;
  48.     char c;
  49.     std::string curr, next;
  50.     while (std::cin >> curr && curr != "END") {
  51.         std::cin >> c >> next;
  52.         sm.states.insert(curr);
  53.         sm.states.insert(next);
  54.         sm.alphabet.insert(c);
  55.         sm.functions.insert({std::pair<std::string, char>(curr, c), next});
  56.     }
  57.     while (std::cin >> curr && curr != "END") {
  58.         sm.end_states.insert(curr);
  59.     }
  60.     std::cin >> sm.start_state;
  61.  
  62.     std::string str;
  63.     std::cin >> str;
  64.  
  65.     auto ans = state_machine::is_word(sm, str);
  66.     std::cout << std::get<0>(ans) << std::endl << std::get<1>(ans) << std::endl << std::get<2>(ans) << std::endl;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment