Pagini recente » Cod sursa (job #1379275) | Cod sursa (job #1592606) | Cod sursa (job #950900) | Cod sursa (job #2924806) | Cod sursa (job #2588498)
#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;
}