Cod sursa(job #3217073)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 20 martie 2024 21:43:25
Problema NFA Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>

std::ifstream fin("nfa.in");
std::ofstream fout("nfa.out");

class NFA {
public:
    void readInput();
    void isWordAccepted(const std::string &word, const int startNode, const int position);
    int getStareInitiala() const { return m_stareInitiala; };
    void resetVisited() {
        visited = std::vector<std::vector<bool>>(400, std::vector<bool>(400, 0));
    }

private:
    std::vector<std::vector<bool>>visited;
    std::vector<std::vector<std::pair<int, char>>>m_graph;
    std::unordered_set<int>m_stariFinale;
    int m_stareInitiala;
};

void NFA::readInput() {
    int nrStari, nrTranzitii, nrStariFinale;

    fin>>nrStari>>nrTranzitii>>nrStariFinale;
    fin>>m_stareInitiala;
    m_graph.resize(nrStari+1);
    for(int i = 0; i < nrStariFinale; i++) {
        int stareFinala;
        fin>>stareFinala;
        m_stariFinale.insert(stareFinala);
    }
    for(int i = 0; i < nrTranzitii; i++) {
        int x, y;
        char l;
        fin>>x>>y>>l;
        m_graph[x].emplace_back(y, l);
    }
}
bool ok;
void NFA::isWordAccepted(const std::string &word, const int startNode, const int position = 0) {
    if(position == word.length()) {
        if(m_stariFinale.find(startNode) != m_stariFinale.end()) {
            ok = 1;
        }
    }
    else {
        for(int i = 0; i < m_graph[startNode].size(); i++) {
            if(m_graph[startNode][i].second == word[position] && visited[m_graph[startNode][i].first][position] == 0) {
                visited[m_graph[startNode][i].first][position] = 1;
                isWordAccepted(word, m_graph[startNode][i].first, position + 1);
            }
        }
    }
}

int main() {
    NFA nfa;

    nfa.readInput();

    int nrCuvinte;
    fin>>nrCuvinte;
    for(int i = 0; i < nrCuvinte; i++) {
        std::string word;
        fin>>word;
        nfa.resetVisited();
        ok = 0;
        nfa.isWordAccepted(word, nfa.getStareInitiala());
        fout<<ok<<'\n';
    }



    return 0;
}