Cod sursa(job #2891055)

Utilizator RobertuRobert Udrea Robertu Data 17 aprilie 2022 13:36:39
Problema NFA Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string>
#define dim 99999
using namespace std;

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

vector<int> stari;
vector<int> stariFin; 
vector<string> cuvinte;
vector<int> drum;

struct Muchie {
    int vecin;
    char lit;
};
vector< vector<Muchie> > v(dim);

int n;
vector<int> fr;

bool ok;

void Verificare(string cuvant, int start, int index) {
    // fr[start] = 1;
    if( !ok ) {
        if(index < cuvant.length()) {
        for(int i = 0; i < v[start].size() && !ok; i++) 
            if( v[start][i].lit == cuvant[index] ) {
                // cout << cuvant[index] << " " << v[start][i].vecin << endl;
                drum.push_back(v[start][i].vecin);
                Verificare(cuvant, v[start][i].vecin, index + 1);
                drum.pop_back();
            }
        }

        if(cuvant.length() == index) {
            for(int i = 0; i < stariFin.size() && !ok; i++)
                if(start == stariFin[i]) {
                    ok = true;

                    fout << 1 << '\n';

                    // fout << "DA -> ";
                    // for(int j = 0; j < drum.size(); j++)
                    //     fout << drum[j] << " ";
                    // fout << endl;

                    break;
                }
        }
    }
}

int main() {
    int m, x, y, S, nrF, nrCuv;
    char l;
    int stare;
    string cuvant;

    fin >> n;
    
    // for(int i = 0; i < n; i++) {
    //     fin >> stare;
    //     stari.push_back(stare);
    // }

    fin >> m;
    // for(int i = 0; i < m; i++) {
    //     fin >> x >> y >> l;

    //     Muchie tranzitie;
    //     tranzitie.vecin = y;
    //     tranzitie.lit = l;

    //     v[x].push_back(tranzitie);
    // }

    // fin >> S;

    fin >> nrF;
    // for(int i = 0; i < nrF; i++) {
    //     fin >> stare;
    //     stariFin.push_back(stare);
    // }

    fin >> S;

    for(int i = 0; i < nrF; i++) {
        fin >> stare;
        stariFin.push_back(stare);
    }

    for(int i = 0; i < m; i++) {
        fin >> x >> y >> l;

        Muchie tranzitie;
        tranzitie.vecin = y;
        tranzitie.lit = l;

        v[x].push_back(tranzitie);
    }

    fin >> nrCuv;
    for(int i = 0; i < nrCuv; i++) {
        fin >> cuvant;
        cuvinte.push_back(cuvant);
    }

    //Verificarea cuvintelor daca sunt OK
    for(int i = 0; i < nrCuv; i++) {
        // cout << "Cuvatul " << i << endl;
        //verfic cuvinte[i] daca e bun
        // fr.resize(n + 1, 0);
        ok = false;
        drum.clear();
        drum.push_back(S);
        Verificare(cuvinte[i], S, 0);
        // fr.clear();

        if( !ok )
            // fout << "NU" << endl;
            fout << 0 << '\n';
        
    }

    // cout << "GATA" << endl;

    return 0;
}