Pagini recente » Cod sursa (job #3287899) | Cod sursa (job #4173) | Cod sursa (job #1515504) | Cod sursa (job #156346) | Cod sursa (job #2588486)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 300
#define SIGMA 26
#define MAXLEN 150
ifstream in ("nfa.in");
ofstream out ("nfa.out");
int stare_finala[1 + MAXN];
bitset <1 + MAXLEN> inq[1 + MAXN];
vector <int> liste_vecini[1 + MAXN][SIGMA];
struct el_coada
{
int nrnod;
int 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;
}
for (i=0; i<M; i++)
{
in>>q1>>q2>>c;
liste_vecini[q1][c - 'a'].push_back(q2);
}
in >> Q;
for (i=0; i<Q; i++)
{
in>>cuvant;
int lungime = (int)(cuvant.length());
int acceptat = 0;
q.push({S, 0});
inq[S][0] = 1;
while (!q.empty())
{
int nodcurent = q.front().nrnod;
int parcurs = q.front().parcurs;
inq[nodcurent][parcurs] = 0;
q.pop();
int chr = cuvant[parcurs] - 'a';
if(parcurs + 1 < lungime)
for (auto x: liste_vecini[nodcurent][chr]){
if(!inq[x][parcurs + 1]){
q.push({x, parcurs + 1});
inq[x][parcurs + 1] = 1;
}
}
else
for (auto x: liste_vecini[nodcurent][chr])
if(stare_finala[x]){
acceptat = 1;
while(!q.empty()){
inq[q.front().nrnod][q.front().parcurs] = 0;
q.pop();
}
break;
}
}
out<<acceptat<<"\n";
}
return 0;
}