Cod sursa(job #2588480)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 24 martie 2020 20:40:52
Problema NFA Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <queue>
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];
bool inq[1 + MAXN][1 + MAXLEN];

vector <short> 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;
        }
        out<<acceptat<<"\n";
    }
    return 0;
}