vlad7576

up09-3 (grammar 2)

May 17th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <cctype>
  5. #include <array>
  6. #include <algorithm>
  7.  
  8. void to_lower(std::string::iterator begin, std::string::iterator end)
  9. {
  10.     std::transform(begin, end, begin, [](unsigned char c) { return std::tolower(c); });
  11. }
  12.  
  13.  
  14. bool is_inconclusive_context_free(const std::multimap<std::string, std::string> &dict)
  15. {
  16.     bool flag1 = false;
  17.     bool flag2 = false;
  18.  
  19.     for (auto &c:dict) {
  20.         if (c.second.find("S") != std::string::npos) {
  21.             flag1 = true;
  22.         }
  23.         if (c.second == "_") {
  24.             if (c.first != "S") {
  25.                 return false;
  26.             } else {
  27.                 flag2 = true;
  28.             }
  29.         }
  30.     }
  31.     return !(flag1 && flag2);
  32. }
  33.  
  34. bool regular_left(const std::multimap<std::string, std::string> &dict)
  35. {
  36.  
  37.     for (auto &c:dict) {
  38.         if (c.second.size() == 1 && c.second[0] == '_') {
  39.             continue;
  40.         }
  41.         std::string tmp(c.second);
  42.         to_lower(tmp.begin() + 1, tmp.end());
  43.         if (tmp != c.second) {
  44.             return false;
  45.         }
  46.     }
  47.     return true;
  48. }
  49.  
  50. bool regular_right(const std::multimap<std::string, std::string> &dict)
  51. {
  52.     for (auto &c:dict) {
  53.         if (c.second.size() == 1 && c.second[0] == '_') {
  54.             continue;;
  55.         }
  56.         std::string tmp(c.second);
  57.         to_lower(tmp.begin(), tmp.end() - 1);
  58.         if (tmp != c.second) {
  59.             return false;
  60.         }
  61.     }
  62.     return true;
  63. }
  64.  
  65. bool automata_left(const std::multimap<std::string, std::string> &dict)
  66. {
  67.     auto range = dict.equal_range("S");
  68.     bool flag1 = false;
  69.     bool flag2 = false;
  70.     for (auto i = range.first; i != range.second; i++) {
  71.         if (i->second.size() > 1) {
  72.             continue;
  73.         }
  74.         if (std::isupper(i->second[0])) {
  75.             flag1 = true;
  76.         }
  77.         if (i->second[0] == '_') {
  78.             flag2 = true;
  79.         }
  80.     }
  81.     if (flag1 && !flag2) {
  82.         return false;
  83.     }
  84.  
  85.     for (auto &c:dict) {
  86.         if (c.second.size() > 2) {
  87.             return false;
  88.         }
  89.         if (c.second.size() == 1 && std::islower(c.second[0]) == 0) {
  90.             if (c.second != "S" && c.first == "S" && (c.second == "_" || std::isupper(c.second[0]))) {
  91.                 continue;;
  92.             } else {
  93.                 return false;
  94.             }
  95.         }
  96.         if (c.second.size() == 2 &&
  97.             (std::isupper(c.second[0]) == 0 || std::islower(c.second[1]) == 0 || (c.second[0] == 'S' && flag2))) {
  98.             return false;
  99.         }
  100.     }
  101.     return true;
  102. }
  103.  
  104.  
  105. bool automata_right(const std::multimap<std::string, std::string> &dict)
  106. {
  107.     auto range = dict.equal_range("S");
  108.     bool flag1 = false;
  109.     bool flag2 = false;
  110.     for (auto i = range.first; i != range.second; i++) {
  111.         if (i->second.size() >= 2) {
  112.             continue;
  113.         }
  114.         if (std::isupper(i->second[0])) {
  115.             flag1 = true;
  116.         }
  117.         if (i->second[0] == '_') {
  118.             flag2 = true;
  119.         }
  120.     }
  121.     if (flag1 && !flag2) {
  122.         return false;
  123.     }
  124.  
  125.     for (auto &c:dict) {
  126.         if (c.second.size() > 2) {
  127.             return false;
  128.         }
  129.         if (c.second.size() == 1 && (std::islower(c.second[0]) == 0)) {
  130.             if (c.second != "S" && c.first == "S" && (c.second == "_" || std::isupper(c.second[0]))) {
  131.                 continue;;
  132.             } else {
  133.                 return false;
  134.             }
  135.         }
  136.         if (c.second.size() == 2 &&
  137.             (std::islower(c.second[0]) == 0 || std::isupper(c.second[1]) == 0 || (c.second[1] == 'S' && flag2))) {
  138.             return false;
  139.         }
  140.     }
  141.     return true;
  142. }
  143.  
  144. int main()
  145. {
  146.     std::multimap<std::string, std::string> dict;
  147.     std::string key, value;
  148.     std::string t("AB");
  149.  
  150.     while (std::cin >> key >> value) {
  151.         dict.insert({key, value});
  152.     }
  153.     std::array<bool, 5> ans;
  154.  
  155.     ans[0] = is_inconclusive_context_free(dict);
  156.     ans[1] = regular_left(dict);
  157.     ans[2] = regular_right(dict);
  158.     ans[3] = automata_left(dict);
  159.     ans[4] = automata_right(dict);
  160.  
  161.     if (!ans[0] && !ans[1] && !ans[2]) {
  162.         std::cout << "2" << std::endl;
  163.     } else if (ans[0] && !ans[1] && !ans[2]) {
  164.         std::cout << "21" << std::endl;
  165.     } else if (ans[1] && !ans[3]) {
  166.         std::cout << "31" << std::endl;
  167.     } else if (ans[3]) {
  168.         std::cout << "311" << std::endl;
  169.     } else if (ans[2] && !ans[4]) {
  170.         std::cout << "32" << std::endl;
  171.     } else if (ans[4]) {
  172.         std::cout << "321" << std::endl;
  173.     }
  174. }
Add Comment
Please, Sign In to add comment