Cod sursa(job #3217180)

Utilizator andu9andu nita andu9 Data 21 martie 2024 17:04:04
Problema NFA Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>
#include <bitset>
#include <string>
#include <queue>

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 print(std::queue<int> coada, int nr) {
    std::cerr << "Coada nr " << nr + 1 << '\n';
    while (!coada.empty()) {
        std::cerr << coada.front() << ' ', coada.pop();
    }
    std::cerr << '\n';
}

void Solve(std::string& cuv, int stare) {
    std::cerr << cuv << '\n';
    std::queue<int> stariCurente; stariCurente.push(stare);
    for (int i = 0; i < (int) cuv.size(); i += 1) {
        std::queue<int> stariObtinute;
        while (!stariCurente.empty()) {
            int stareCurenta = stariCurente.front();
            for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
                if (automat[stareCurenta][j].second == cuv[i])
                    stariObtinute.push(automat[stareCurenta][j].first);
            stariCurente.pop();
        }

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

        stariCurente = stariObtinute;

        print(stariObtinute, i);
    }

    while (!stariCurente.empty()) {
        int nodCurent = stariCurente.front();
        if (stareFinala[nodCurent]) { fout << "1\n"; return; }
        stariCurente.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 u; fin >> u; stareFinala[u] = true;
    }
    automat.assign(n + 1, std::vector<std::pair<int, char>> ());
    for (int i = 0; i < m; i += 1) {
        int u, v; char w; fin >> u >> v >> w;
        automat[u].emplace_back(std::make_pair(v, w));
    }

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