Cod sursa(job #2588432)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 24 martie 2020 19:54:16
Problema NFA Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
#include <string>
#include <queue>
using namespace std;

ifstream in ("nfa.in");
ofstream out ("nfa.out");

int stare_finala[301];

struct vecin
{
    int nrnod;
    char valmuchie;

    vecin(int _nrnod, char _valmuchie)
    {
        nrnod = _nrnod;
        valmuchie = _valmuchie;
    }
};
struct el_coada
{
    int nrnod;
    int parcurs;

    el_coada (int _nrnod, int _parcurs)
    {
        nrnod = _nrnod;
        parcurs = _parcurs;
    }
};
queue <el_coada> q;

int main()
{
    int N, M, K, x, i, q1, q2, Q, S;
    char c;
    string cuvant;

    in >> N >> M >> K >> S;
    for (i=0; i<K; i++)
    {
        in>>x;
        stare_finala[x]=1;
    }

    vector <vecin> liste_vecini[N+1];
    for (i=0; i<M; i++)
    {
        in>>q1>>q2>>c;
        liste_vecini[q1].push_back({q2, c});
    }
    in >> Q;
    for (i=0; i<Q; i++)
    {
        in>>cuvant;
        int lungime {static_cast<int>(cuvant.length())};
        int acceptat = 0, nodcurent, parcurs;
        q.push({S, 0});
        while (q.empty() == 0)
        {
            nodcurent = q.front().nrnod;
            parcurs = q.front().parcurs;
            if (parcurs == lungime)
            {
                if (stare_finala[nodcurent]==1)
                {
                    acceptat = 1;
                    break;
                }
            }
            else
            {
                for (vecin x : liste_vecini[nodcurent])
                {
                    if (x.valmuchie == cuvant[parcurs])
                    {
                        q.push({x.nrnod, parcurs + 1});
                    }
                }
            }
            q.pop();
        }
        out<<acceptat<<"\n";
    }
    return 0;
}