Cod sursa(job #3217178)

Utilizator andu9andu nita andu9 Data 21 martie 2024 16:41:44
Problema NFA Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.36 kb
//
///* Implementare automat finit nedeterminist */
//
//#include <fstream>
//#include <climits>
//#include <utility>
//#include <vector>
//#include <bitset>
//#include <string>
//#include <queue>
//
//std::ifstream fin("input.txt");
//std::ofstream fout("output.txt");
//
//const int nMax = (int) 1e6;
//
//std::bitset<nMax> stareFinala;
//
//std::vector<int> stari;
//std::vector<std::vector<std::pair<int, char>>> automat;
//
//void Solve(std::string& cuvant, int stareaInitiala) {
//    std::queue<int> coada; coada.push(stareaInitiala);
//
//    for (int i = 0; i < (int) cuvant.size(); i += 1) {
//        std::queue<int> stariObtinute;
//        while (!coada.empty()) {
//            int stareCurenta = coada.front();
//            for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
//                if (automat[stareCurenta][j].second == cuvant[i])
//                    stariObtinute.push(automat[stareCurenta][j].first);
//            coada.pop();
//        }
//
//        if (stariObtinute.empty()) {
//            fout << "NU\n";
//            return;
//        }
//
//        coada = stariObtinute;
//    }
//
//    while (!coada.empty()) {
//        int stare = coada.front();
//        if (stareFinala[stare]) {
//            fout << "DA\n";
//            return;
//        }
//        coada.pop();
//    }
//
//    fout << "NU\n";
//}
//
//int main() {
//    int n, Min = INT_MAX; fin >> n;
//    stari.resize(n);
//    for (int i = 0; i < n; i += 1) {
//        fin >> stari[i];
//        Min = std::min(Min, stari[i]);
//    }
//
//    if (Min < 0)
//        for (int i = 0; i < n; i += 1)
//            stari[i] -= Min;
//
//    int Max = INT_MIN;
//    for (int i = 0; i < n; i += 1)
//        Max = std::max(Max, stari[i]);
//
//
//    automat.assign(Max + 1, std::vector<std::pair<int, char>> ());
//
//
//    int m; fin >> m;
//    for (int i = 0; i < m; i += 1) {
//        int u, v; char w; fin >> u >> v >> w;
//        if (Min < 0) u -= Min, v -= Min;
//
//
//        automat[u].emplace_back(std::make_pair(v, w));
//    }
//
//    int stareaInitiala; fin >> stareaInitiala;
//    if (Min < 0) stareaInitiala -= Min;
//
//    int nrStariFinale; fin >> nrStariFinale;
//    for (int i = 0; i < nrStariFinale; i += 1) {
//        int u; fin >> u;
//        if (Min < 0) u -= Min;
//
//        stareFinala[u] = true;
//    }
//
//    int nrCuvinte; fin >> nrCuvinte;
//    for (int i = 0; i < nrCuvinte; i += 1) {
//        std::string cuvant; fin >> cuvant;
//        Solve(cuvant, stareaInitiala);
//    }
//    return 0;
//}
#include <fstream>
#include <utility>
#include <vector>
#include <queue>
#include <bitset>

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

const int nMax = 301;

std::bitset<nMax> stareFinala;

std::vector<std::vector<std::pair<int, char>>> automat;

void Solve(std::string& cuvant, int stareInitiala) {
    std::queue<int> coada; coada.push(stareInitiala);
    for (int i = 0; i < (int) cuvant.size(); i += 1) {
        std::queue<int> stariObtinute;
        while (!coada.empty()) {
            int stareCurenta = coada.front();
            for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
                if (automat[stareCurenta][j].second == cuvant[i])
                    stariObtinute.push(automat[stareCurenta][j].first);
            coada.pop();
        }

        if (stariObtinute.empty()) {
            fout << "0\n";
            return;
        }

        coada = stariObtinute;
    }

    while (!coada.empty()) {
        int stare = coada.front();
        if (stareFinala[stare]) {
            fout << "1\n";
            return;
        }
        coada.pop();
    }
    fout << "0\n";
}

int main() {
    int n, m, k; fin >> n >> m >> k;
    int stareInitiala; fin >> stareInitiala;
    for (int i = 0; i < k; i += 1) {
        int stare; fin >> stare;
        stareFinala[stare] = true;
    }
    automat.assign(n + 1, std::vector<std::pair<int, char>> ());
    for (int i = 0; i < n; i += 1) {
        int u, v; char w; fin >> u >> v >> w;
        automat[u].emplace_back(std::make_pair(v, w));
    }

    int nrCuvinte; fin >> nrCuvinte;
    for (int i = 0; i < nrCuvinte; i += 1) {
        std::string cuvant; fin >> cuvant;
        Solve(cuvant, stareInitiala);
    }
    return 0;
}