Pagini recente » Cod sursa (job #3292998) | Cod sursa (job #2171850) | Cod sursa (job #2875298) | Cod sursa (job #1131335) | Cod sursa (job #3217073)
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>
std::ifstream fin("nfa.in");
std::ofstream fout("nfa.out");
class NFA {
public:
void readInput();
void isWordAccepted(const std::string &word, const int startNode, const int position);
int getStareInitiala() const { return m_stareInitiala; };
void resetVisited() {
visited = std::vector<std::vector<bool>>(400, std::vector<bool>(400, 0));
}
private:
std::vector<std::vector<bool>>visited;
std::vector<std::vector<std::pair<int, char>>>m_graph;
std::unordered_set<int>m_stariFinale;
int m_stareInitiala;
};
void NFA::readInput() {
int nrStari, nrTranzitii, nrStariFinale;
fin>>nrStari>>nrTranzitii>>nrStariFinale;
fin>>m_stareInitiala;
m_graph.resize(nrStari+1);
for(int i = 0; i < nrStariFinale; i++) {
int stareFinala;
fin>>stareFinala;
m_stariFinale.insert(stareFinala);
}
for(int i = 0; i < nrTranzitii; i++) {
int x, y;
char l;
fin>>x>>y>>l;
m_graph[x].emplace_back(y, l);
}
}
bool ok;
void NFA::isWordAccepted(const std::string &word, const int startNode, const int position = 0) {
if(position == word.length()) {
if(m_stariFinale.find(startNode) != m_stariFinale.end()) {
ok = 1;
}
}
else {
for(int i = 0; i < m_graph[startNode].size(); i++) {
if(m_graph[startNode][i].second == word[position] && visited[m_graph[startNode][i].first][position] == 0) {
visited[m_graph[startNode][i].first][position] = 1;
isWordAccepted(word, m_graph[startNode][i].first, position + 1);
}
}
}
}
int main() {
NFA nfa;
nfa.readInput();
int nrCuvinte;
fin>>nrCuvinte;
for(int i = 0; i < nrCuvinte; i++) {
std::string word;
fin>>word;
nfa.resetVisited();
ok = 0;
nfa.isWordAccepted(word, nfa.getStareInitiala());
fout<<ok<<'\n';
}
return 0;
}