Cod sursa(job #2588498)

Utilizator lauratenderLaura Tender lauratender Data 24 martie 2020 20:58:51
Problema NFA Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <fstream>
#include <vector>
#include <string>
using namespace std;

ifstream in ("nfa.in");
ofstream out ("nfa.out");
#define MAXN 300
#define MAXLEN 150
int stare_finala[MAXN+1];
char inq[1 + MAXN][1 + MAXLEN];

struct vecin
{
    int nrnod;
    char valmuchie;
};
struct el_coada
{
    int nrnod;
    int parcurs;
    el_coada* urm;
};

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;
        vecin pereche;
        pereche.nrnod = q2;
        pereche.valmuchie = c;
        liste_vecini[q1].push_back(pereche);
    }
    in>>Q;
    for (i=0; i<Q; i++)
    {
        in>>cuvant;
        int lungime {static_cast<int>(cuvant.length())};
        int acceptat = 0, nodcurent;
        el_coada *prim = new el_coada;
        prim->nrnod = S;
        prim->parcurs = 0;
        prim->urm = nullptr;
        el_coada* ultim = prim;
        inq[S][0] = 1;
        while (prim != nullptr)
        {
            nodcurent = prim->nrnod;
            inq[nodcurent][prim->parcurs] = 0;
            if (prim->parcurs == lungime)
            {
                if (stare_finala[nodcurent]==1)
                {
                    acceptat = 1;
                    break;
                }
            }
            else
            {
                for (vecin x : liste_vecini[nodcurent])
                {
                    if (x.valmuchie == cuvant[prim->parcurs] && inq[x.nrnod][prim->parcurs + 1]!=1)
                    {
                        el_coada* aux = new el_coada;
                        aux->nrnod = x.nrnod;
                        aux->parcurs = prim->parcurs + 1;
                        aux->urm = nullptr;
                        ultim->urm = aux;
                        ultim = aux;
                        inq[x.nrnod][prim->parcurs + 1] = 1;
                    }
                }
            }
            el_coada* temp = prim;
            prim = prim -> urm;
            delete(temp);
        }
        out<<acceptat<<"\n";
    }
    return 0;
}