Cod sursa(job #3216963)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 20 martie 2024 17:14:03
Problema NFA Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 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 ok;

void isWordAccepted(const std::string &word, const int start, const int posInWord) {
    if(posInWord == word.length()) {
        if(stariFinale.find(start) != stariFinale.end()) {
            ok = 1;
        }
    }
    else {
        for(int i = 0; i < graf[start].size(); i++) {
            if(graf[start][i].second == word[posInWord]) {
                isWordAccepted(word, graf[start][i].first, posInWord + 1);
            }
        }
    }
}

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;
        ok = 0;
        isWordAccepted(cuvant, stareInitiala, 0);
        fout << ok << '\n';
    }

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

    return 0;
}