Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <set>
  4. #include <vector>
  5. #include <queue>
  6.  
  7. int main() {
  8. std::map<std::pair<size_t, char>, std::vector<size_t> > go;
  9. std::map<size_t, std::vector<size_t> > epsGraph;
  10.  
  11. std::map<std::string, size_t> states;
  12.  
  13. auto addState = [&](const std::string& state) {
  14. if (!states.count(state)) {
  15. size_t id = states.size();
  16. states[state] = id;
  17. }
  18. };
  19.  
  20. auto getState = [&](const std::string& state) -> size_t {
  21. addState(state);
  22. return states[state];
  23. };
  24.  
  25. while (true) {
  26. std::string cur;
  27. std::cin >> cur;
  28. if (cur == "END") {
  29. break;
  30. }
  31. std::string s, to;
  32. std::cin >> s >> to;
  33.  
  34. if (s == "eps") {
  35. epsGraph[getState(cur)].push_back(getState(to));
  36. } else {
  37. go[{getState(cur), s[0]}].push_back(getState(to));
  38. }
  39. }
  40.  
  41. std::set<size_t> terms;
  42.  
  43. {
  44. std::string term;
  45. while (true) {
  46. std::cin >> term;
  47. if (term == "END") break;
  48. terms.insert(getState(term));
  49. }
  50. }
  51.  
  52. std::string startState;
  53. std::cin >> startState;
  54.  
  55. std::string text;
  56. std::cin >> text;
  57.  
  58. std::vector<bool> reach(states.size());
  59. reach[getState(startState)] = true;
  60.  
  61. for (size_t i = 0; i < text.size(); i++) {
  62. std::queue<size_t> q;
  63. for (size_t i = 0; i < states.size(); i++) {
  64. if (reach[i]) {
  65. q.push(i);
  66. }
  67. }
  68.  
  69. while (!q.empty()) {
  70. size_t v = q.front();
  71. q.pop();
  72. for (const auto& to : epsGraph[v]) {
  73. if (!reach[to]) {
  74. reach[to] = true;
  75. q.push(to);
  76. }
  77. }
  78. }
  79.  
  80. std::vector<bool> goReach(states.size());
  81. bool reachable = false;
  82. for (size_t j = 0; j < states.size(); j++) {
  83. if (reach[j]) {
  84. for (const auto& to : go[{j, text[i]}]) {
  85. goReach[to] = true;
  86. reachable = true;
  87. }
  88. }
  89. }
  90.  
  91. if (!reachable) {
  92. std::cout << "0\n";
  93. std::cout << i << "\n";
  94. return 0;
  95. }
  96.  
  97. reach = std::move(goReach);
  98. }
  99.  
  100. bool termed = false;
  101. for (size_t i = 0; i < reach.size(); i++) {
  102. if (reach[i] && terms.count(i)) {
  103. termed = true;
  104. }
  105. }
  106.  
  107. if (termed) {
  108. std::cout << "1\n";
  109. } else {
  110. std::cout << "0\n";
  111. }
  112. std::cout << text.size() << "\n";
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement