Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <set>
- #include <vector>
- #include <queue>
- int main() {
- std::map<std::pair<size_t, char>, std::vector<size_t> > go;
- std::map<size_t, std::vector<size_t> > epsGraph;
- std::map<std::string, size_t> states;
- auto addState = [&](const std::string& state) {
- if (!states.count(state)) {
- size_t id = states.size();
- states[state] = id;
- }
- };
- auto getState = [&](const std::string& state) -> size_t {
- addState(state);
- return states[state];
- };
- while (true) {
- std::string cur;
- std::cin >> cur;
- if (cur == "END") {
- break;
- }
- std::string s, to;
- std::cin >> s >> to;
- if (s == "eps") {
- epsGraph[getState(cur)].push_back(getState(to));
- } else {
- go[{getState(cur), s[0]}].push_back(getState(to));
- }
- }
- std::set<size_t> terms;
- {
- std::string term;
- while (true) {
- std::cin >> term;
- if (term == "END") break;
- terms.insert(getState(term));
- }
- }
- std::string startState;
- std::cin >> startState;
- std::string text;
- std::cin >> text;
- std::vector<bool> reach(states.size());
- reach[getState(startState)] = true;
- for (size_t i = 0; i < text.size(); i++) {
- std::queue<size_t> q;
- for (size_t i = 0; i < states.size(); i++) {
- if (reach[i]) {
- q.push(i);
- }
- }
- while (!q.empty()) {
- size_t v = q.front();
- q.pop();
- for (const auto& to : epsGraph[v]) {
- if (!reach[to]) {
- reach[to] = true;
- q.push(to);
- }
- }
- }
- std::vector<bool> goReach(states.size());
- bool reachable = false;
- for (size_t j = 0; j < states.size(); j++) {
- if (reach[j]) {
- for (const auto& to : go[{j, text[i]}]) {
- goReach[to] = true;
- reachable = true;
- }
- }
- }
- if (!reachable) {
- std::cout << "0\n";
- std::cout << i << "\n";
- return 0;
- }
- reach = std::move(goReach);
- }
- bool termed = false;
- for (size_t i = 0; i < reach.size(); i++) {
- if (reach[i] && terms.count(i)) {
- termed = true;
- }
- }
- if (termed) {
- std::cout << "1\n";
- } else {
- std::cout << "0\n";
- }
- std::cout << text.size() << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement