Cod sursa(job #3216960)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 20 martie 2024 17:09:24
Problema NFA Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>
#include <queue>

std::vector<std::vector<std::pair<int, int>>>graf;
std::unordered_set<int>stariFinale;
int stareInitiala;

bool isWordAccepted(const std::string &word) {
    std::queue<std::pair<int, int>> nodes_to_visit;
    std::unordered_set<int> visited;

    nodes_to_visit.emplace(stareInitiala, 0);

    while(!nodes_to_visit.empty()) {
        const std::pair<int, int> current = nodes_to_visit.front();
        const int currentNode = current.first;
        const int currentPosition = current.second;

        if(currentPosition == word.length()) {
            if(stariFinale.find(currentNode) != stariFinale.end()) {
                return true;
            }
        }

            for(const auto &neighbour: graf[currentNode]) {
                if(neighbour.second == word[currentPosition]) {
                    nodes_to_visit.emplace(neighbour.first, currentPosition + 1);
                }
            }

        nodes_to_visit.pop();
    }

    return false;
}

int main() {
    std::ifstream fin("nfa.in");
    std::ofstream fout("nfa.out");
    int nrStari, nrTranzitii, nrStariFinale;

    fin>>nrStari>>nrTranzitii>>nrStariFinale;
    fin>>stareInitiala;

    graf.resize(nrStari + 1);

    for(int i = 0; i < nrStariFinale; i++) {
        int stareFinala;
        fin>>stareFinala;
        stariFinale.insert(stareFinala);
    }
    for(int i = 0; i < nrTranzitii; i++) {
        int x, y;
        char l;
        fin>>x>>y>>l;
        graf[x].emplace_back(y, l);
    }

    int nrCuvinte;
    fin>>nrCuvinte;
    for(int i = 0; i < nrCuvinte; i++) {
        std::string cuvant;
        fin>>cuvant;

        fout << isWordAccepted(cuvant) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}