Cod sursa(job #2588198)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 24 martie 2020 16:01:58
Problema NFA Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;

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

const int N=10005;

vector< pair < int, char > >a[N];
queue < pair <int, string > > Q;
unordered_map <string, int >Map;

int n,m,q0,t,q,pasi,stfinala,gsol=0,nrcuv=0;
bool qf[N],viz[N][N];

void dfs(int nod,char c,char cuv[])
{
    int i,vecin;
    char cost;
    //out<<nod<<" "<<pasi<<"|";
    if(gsol==1)
        return;
    if(pasi==strlen(cuv))
    {
        stfinala=nod;
        if(qf[stfinala]==true)
        {
            //out<<cuv<<" am solutie "<<1<<'\n';
            out<<1<<'\n';
            gsol=1;
            return;
        }
    }
    int ok=0;
    for(i=0; i<a[nod].size(); i++)
    {
        vecin=a[nod][i].first;
        cost=a[nod][i].second;
        if(c==cost && viz[vecin][pasi]==1)
        {
            //cout<<vecin<<" "<<cost<<" "<<pasi<<" "<<cuv<<" "<<cuv[pasi]<<" "<<cuv[pasi+1]<<'\n';
            viz[vecin][pasi]=0;
            pasi++;
            ok=1;
            dfs(vecin,cuv[pasi],cuv);
            pasi--;
        }
    }
    if(ok==0)
    {
        stfinala=-1;
        return;
    }
}
// sa nu trec prin acelasi loc de 2 ori cu aceeasi lungime


void citire()
{
    int i,qfin;
    int x,y;
    char c,cuv[1000];
    in>>n>>m>>t;
    in>>q0;
    for(i=1; i<=t; i++)
    {
        in>>qfin;
        qf[qfin]=true;
    }
    for(i = 1 ; i <= m; i++)
    {
        in>>x>>y>>c;
        a[x].push_back(make_pair(y,c));
    }
    in>>q;
    for(i=1; i<=q; i++)
    {
        in>>cuv;
        //out<<verif(cuv)<<'\n';
        int l=strlen(cuv);
        for(int j = 1 ; j <= n ; j++)
            for(int u = 0 ; u < l ; u++ )
                viz[j][u]=1;
        pasi=0;
        gsol=0;
        dfs(q0,cuv[pasi],cuv);
        if(gsol==0)
            out<<0<<'\n';
        //out<<stfinala<<'\n';
    }
    for(int j = 1 ; j <= n ; j++)
        for(int u = 0 ; u < N ; u++ )
            viz[j][u]=1;
    //bfs();
}

int main()
{
    int i,j;
    //generare();
    citire();
    /*
    for(i = 1; i <= n; i++)
    {
        out<<i<<" ";
        for(j = 0; j < a[i].size(); j++)
        {
            out<<a[i][j].first<<" "<<a[i][j].second<<"|";
        }
        out<<endl;
    }
    */
    return 0;
}