Advertisement
Matvey_Borisov

ДКА

Nov 20th, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.35 KB | None | 0 0
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <queue>
  5. #include <set>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. struct transition {
  11.   int s;
  12.   int f;
  13.   char c;
  14.  
  15.   transition(int _s, int _f, char _c) : s(_s), f(_f), c(_c) {}
  16.   transition() = default;
  17.   bool operator==(const transition &other) const {
  18.     return s == other.s && f == other.f && c == other.c;
  19.   }
  20. };
  21.  
  22. class nFA {
  23. private:
  24.   vector<vector<int>> Q; // states - состояния // состаяния в векторе упорядочены по возрастанию
  25.   vector<char> A; //конечный входной алфавит автомата;
  26.   vector<transition> d; // transitions - переходы
  27.   int q0;               //начальное сотсояние автомата
  28.   vector<int> F;        //конечные состояния автомата
  29.  
  30.   int transit(int q, char ch) {
  31.     int res = q;
  32.     for (auto it = d.begin(); it != d.end(); it++) {
  33.       if (it->s == q && it->c == ch)
  34.         res = it->f;
  35.     }
  36.     return res;
  37.   }
  38.  
  39. public:
  40.   nFA(vector<vector<int>> _Q, vector<transition> _d, int _q0, vector<int> _F) : Q(_Q), d(_d), q0(_q0), F(_F) {
  41.     set<char> s;
  42.     for (auto it = d.begin(); it != d.end(); it++) {
  43.       s.insert(it->c);
  44.     }
  45.     A = vector<char>(s.begin(), s.end());
  46.   }
  47.  
  48.   ~nFA() {
  49.     Q.clear();
  50.     d.clear();
  51.     F.clear();
  52.     A.clear();
  53.   }
  54.  
  55.   bool isDeterministic() {
  56.     for (auto it = d.begin(); it != d.end(); it++) {
  57.       for (auto et = d.begin(); et != d.end(); et++) {
  58.         if (it->s == et->s && it->c == et->c && it->f != et->f)
  59.           return false;
  60.       }
  61.     }
  62.     return true;
  63.   }
  64.  
  65.   vector<int> move(vector<int> state, char letter) {
  66.     vector<int> res;
  67.     set<int> v;
  68.     for (auto it = state.begin(); it != state.end(); it++) {
  69.       for (auto et = d.begin(); et != d.end(); et++) {
  70.         if (et->s == *it && et->c == letter)
  71.           v.insert(et->f);
  72.       }
  73.     }
  74.     res = vector<int>(v.begin(), v.end());
  75.     sort(res.begin(), res.end());
  76.     return res;
  77.   }
  78.  
  79.   bool isTerminal(vector<int> q) {
  80.     for (auto state = q.begin(); state != q.end(); state++) {
  81.       if (find(F.begin(), F.end(), *state) != F.end())
  82.         return true;
  83.     }
  84.     return false;
  85.   }
  86.  
  87.   bool isAccepting(string str) {
  88.     int len = str.length();
  89.     vector<int> q = {q0};
  90.     for (int i = 0; i < len; i++) {
  91.       q = move(q, str[i]);
  92.     }
  93.     return isTerminal(q);
  94.   }
  95.  
  96.   nFA *determinize() {
  97.     vector<vector<int>> Q1;
  98.     vector<transition> d1;
  99.     queue<vector<int>> Queue;
  100.  
  101.     vector<int> currStates;
  102.     vector<int> newStates;
  103.  
  104.     Queue.push({q0});
  105.     Q1.push_back({q0});
  106.  
  107.     while (!Queue.empty()) {
  108.       currStates = Queue.front();
  109.       Queue.pop();
  110.       for (auto letter = A.begin(); letter != A.end(); letter++) {
  111.         newStates.clear();
  112.         newStates = move(currStates, *letter);
  113.         if (newStates.size() != 0) {
  114.           if (find(Q1.begin(), Q1.end(), newStates) == Q1.end()) {
  115.             Q1.push_back(newStates);
  116.             Queue.push(newStates);
  117.           }
  118.  
  119.           vector<transition> newd;
  120.           for (auto state = newStates.begin(); state != newStates.end(); state++) {
  121.             for (auto it = d.begin(); it != d.end(); it++) {
  122.               if (it->f == *state && it->c == *letter) {
  123.                 newd.push_back(transition(it->s, it->f, it->c));
  124.               }
  125.             }
  126.           }
  127.           for (auto it = newd.begin(); it != newd.end(); it++) {
  128.             if (find(d1.begin(), d1.end(), *it) == d1.end()) {
  129.               d1.push_back(*it);
  130.             }
  131.           }
  132.         }
  133.       }
  134.     }
  135.  
  136.     return new nFA(Q1, d1, q0, F);
  137.   }
  138.  
  139.   void print() {
  140.     for (auto it = Q.begin(); it != Q.end(); it++) {
  141.       cout << "<";
  142.       for (auto state = it->begin(); state != it->end(); state++) {
  143.         cout << *state << " ";
  144.       }
  145.       cout << ">" << endl;
  146.     }
  147.     cout << endl;
  148.     cout << endl;
  149.     for (auto it = d.begin(); it != d.end(); it++) {
  150.       cout << it->s << " " << it->f << " " << it->c << endl;
  151.     }
  152.   }
  153. };
  154.  
  155. int main() {
  156.   ifstream ins("input.txt");
  157.   ofstream outs("output.txt");
  158.  
  159.   int N; //количество состояний автомата
  160.   int k; //номер начального состояния
  161.   int f; //количество конечных состояний
  162.   int p; //количество функций переходов
  163.   int T; //количество строк, распознаваемость конечным автоматом которых
  164.          //необходимо проверить
  165.  
  166.   ins >> N >> k >> f;
  167.  
  168.   vector<vector<int>> Q;
  169.   for (int i = 0; i < N; i++) {
  170.     Q.push_back({i});
  171.   }
  172.  
  173.   vector<int> F;
  174.   for (int i = 0; i < f; i++) {
  175.     int q;
  176.     ins >> q;
  177.     F.push_back(q);
  178.   }
  179.  
  180.   ins >> p;
  181.   vector<transition> d;
  182.   for (int i = 0; i < p; i++) {
  183.     transition t;
  184.     ins >> t.s >> t.f >> t.c;
  185.     d.push_back(t);
  186.   }
  187.  
  188.   nFA *ka = new nFA(Q, d, k, F);
  189.  
  190.   if (!ka->isDeterministic()) {
  191.     nFA *nka = ka->determinize();
  192.     delete ka;
  193.     ka = nka;
  194.   }
  195.  
  196.   ins >> T;
  197.   for (int i = 0; i < T; i++) {
  198.     string str;
  199.     ins >> str;
  200.     if (ka->isAccepting(str))
  201.       outs << "YES" << endl;
  202.     else
  203.       outs << "NO" << endl;
  204.   }
  205.  
  206.   delete ka;
  207.   ins.close();
  208.   outs.close();
  209.   return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement