Cod sursa(job #3216955)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 20 martie 2024 16:44:31
Problema NFA Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <vector>

class NFA {
public:
    NFA() = default;
    ~NFA() = default;

    void citesteNMK(std::ifstream &fin);
    bool isAccepted(const std::string &word);

private:
    std::vector<std::vector<std::pair<int, char>>> m_graf;
    std::unordered_set<int> m_stariFinale;
    int m_stareInitiala;
};

void NFA::citesteNMK(std::ifstream &fin) {
    int n,m,k;
    fin>>n>>m>>k;
    m_graf.resize(n+1);
    fin>>m_stareInitiala;
    for(int i = 0; i < k; i++) {
        int sf;
        fin>>sf;
        m_stariFinale.insert(sf);
    }
    for(int i = 0; i < m; i++) {
        int x, y;
        char l;
        fin>>x>>y>>l;
        m_graf[x].emplace_back(y, l);
    }
}

bool NFA::isAccepted(const std::string &word) {
    std::queue<std::pair<int, int>> nodes_to_visit;

    nodes_to_visit.emplace(m_stareInitiala, 0);

    while(!nodes_to_visit.empty()) {
                //(nod, pozitie_in_cuvant)
        std::pair<int, int> currentNode = nodes_to_visit.front();

        if(currentNode.second == word.length()) {
            if(m_stariFinale.find(currentNode.first) != m_stariFinale.end()) {
                return true;
            }
        }

        for(const auto &node: m_graf[currentNode.first]) {
            if(node.second == word[currentNode.second]) {
                nodes_to_visit.emplace(node.first, currentNode.second + 1);
                //printf("De la nodul %d ma duc la nodul %d\n", currentNode.first, node.first);
            }
        }



        nodes_to_visit.pop();
    }

    return false;
}

int main() {
    std::ifstream fin("nfa.in");
    std::ofstream fout("nfa.out");
    NFA nfa;

    nfa.citesteNMK(fin);

    int nrCuvinte;

    fin>>nrCuvinte;

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

        bool wasAccepted = nfa.isAccepted(cuvant);

        fout<<wasAccepted<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}