Pagini recente » Cod sursa (job #2873297) | Cod sursa (job #2399597) | Cod sursa (job #1342210) | Cod sursa (job #3205820) | Cod sursa (job #2588198)
#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;
}