vlad7576

up09-5 (unreachable)

May 17th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <set>
  5. #include <vector>
  6. #include <cctype>
  7.  
  8. std::multimap<char, std::string> clear_unreachable(const std::multimap<char, std::string> &grammar)
  9. {
  10.     std::multimap<char, std::string> cleared;
  11.  
  12.     std::set<char> reachable;
  13.     reachable.insert('S');
  14.     size_t old_size = 0;
  15.  
  16.     while (old_size != reachable.size()) {
  17.         old_size = reachable.size();
  18.  
  19.         for (auto i = reachable.begin(); i != reachable.end(); ++i) {
  20.             auto tmp_range = grammar.equal_range(*i);
  21.             for (auto j = tmp_range.first; j != tmp_range.second; ++j) {
  22.                 for (auto &c:j->second) {
  23.                     if (isupper(c)) {
  24.                         reachable.insert(c);
  25.                     }
  26.                 }
  27.             }
  28.         }
  29.     }
  30.     for (auto &c:grammar) {
  31.         if (reachable.find(c.first) != reachable.end()) {
  32.             cleared.insert(c);
  33.         }
  34.     }
  35.     return cleared;
  36. }
  37.  
  38. int main()
  39. {
  40.     std::multimap<char, std::string> grammar;
  41.     char left;
  42.     std::string right;
  43.     while (std::cin >> left >> right) {
  44.         grammar.insert({left, right});
  45.     }
  46.  
  47.     auto tmp = clear_unreachable(grammar);
  48.     for (auto &c:tmp) {
  49.         std::cout << c.first << " " << c.second << std::endl;
  50.     }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment