Cod sursa(job #2620774)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 29 mai 2020 17:33:52
Problema NFA Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <bits/stdc++.h>

using namespace std;

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

struct edge
{
    int x, y;
    char c;
};

class automat
{
private:

    int N;
    int initialState;
    set <int> finalState;
    vector < map < char, vector <int> > > E;
    set < pair <int, int> > vis;

    bool DFS(int node, string &X, int index)
    {
        vis.insert(make_pair(node, index));
        if(index == X.size())
            return finalState.find(node) != finalState.end();
        bool ret = false;
        if(E[node].find(X[index]) != E[node].end())
            for(auto it : E[node][X[index]])
                if(vis.find(make_pair(it, index + 1)) == vis.end())
                    ret = ret || DFS(it, X, index + 1);
        return ret;
    }
public:
    automat(int numOfNodes, vector <edge> edges, int q0, vector <int> qf)
    {
        N = numOfNodes;
        initialState = q0;
        for(auto it : qf)
            finalState.insert(it);
        E.resize(N + 5);
        for(auto it : edges)
            E[it.x][it.c].push_back(it.y);
    }
    bool accepts(string &X)
    {
        vis.clear();
        return DFS(initialState, X, 0);
    }
    void outputFirstK(int K)
    {
        int cnt = 0;
        queue < pair < int, string > > Q;
        string S;
        Q.push(make_pair(initialState, S));
        while(!Q.empty() && cnt <= 1e8 && K >= 1)
        {
            int node = Q.front().first;
            S = Q.front().second;
            Q.pop();
            if(finalState.find(node) != finalState.end())
            {
                K--;
                cout << S << "\n";
            }
            for(auto it : E[node])
            {
                S.push_back(it.first);
                for(auto it2: it.second)
                    Q.push(make_pair(it2, S));
                S.pop_back();
            }
            cnt++;
        }
    }
};

int N, M, F, q0;
vector <edge> E;
vector <int> fi;

int main()
{
    fin >> N >> M >> F; /// pe prima linie N numarul de stari
        /// M numarul de arce ale automatului

    fin >> q0; /// starea initiala;
    for(int i = 1; i <= F; i++) /// citesc starile finale
    {
        int q;
        fin >> q;
        fi.push_back(q);
    }
    for(int i = 1; i <= M; i++) /// citesc arcele
    {
        int x, y;
        char c;
        fin >> x >> y >> c;
        E.push_back({x, y, c});
    }

    automat Q(N, E, q0, fi);
    for(fin >> M; M; M--) /// citesc cuvintele
    {
        string S;
        fin >> S;
        fout << Q.accepts(S) << "\n";
       /* if(Q.accepts(S))
            cout << S << " este acceptat\n";
        else
            cout << S << " nu este acceptat\n";*/
    }
    //Q.outputFirstK(100);
    return 0;
}