Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <map>
- #include <set>
- #include <vector>
- #include <cctype>
- std::multimap<char, std::string> clear_unreachable(const std::multimap<char, std::string> &grammar)
- {
- std::multimap<char, std::string> cleared;
- std::set<char> reachable;
- reachable.insert('S');
- size_t old_size = 0;
- while (old_size != reachable.size()) {
- old_size = reachable.size();
- for (auto i = reachable.begin(); i != reachable.end(); ++i) {
- auto tmp_range = grammar.equal_range(*i);
- for (auto j = tmp_range.first; j != tmp_range.second; ++j) {
- for (auto &c:j->second) {
- if (isupper(c)) {
- reachable.insert(c);
- }
- }
- }
- }
- }
- for (auto &c:grammar) {
- if (reachable.find(c.first) != reachable.end()) {
- cleared.insert(c);
- }
- }
- return cleared;
- }
- int main()
- {
- std::multimap<char, std::string> grammar;
- char left;
- std::string right;
- while (std::cin >> left >> right) {
- grammar.insert({left, right});
- }
- auto tmp = clear_unreachable(grammar);
- for (auto &c:tmp) {
- std::cout << c.first << " " << c.second << std::endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment