Pagini recente » Cod sursa (job #1597501) | Cod sursa (job #2788778) | Cod sursa (job #3261206) | Cod sursa (job #3292682) | Cod sursa (job #3216960)
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>
#include <queue>
std::vector<std::vector<std::pair<int, int>>>graf;
std::unordered_set<int>stariFinale;
int stareInitiala;
bool isWordAccepted(const std::string &word) {
std::queue<std::pair<int, int>> nodes_to_visit;
std::unordered_set<int> visited;
nodes_to_visit.emplace(stareInitiala, 0);
while(!nodes_to_visit.empty()) {
const std::pair<int, int> current = nodes_to_visit.front();
const int currentNode = current.first;
const int currentPosition = current.second;
if(currentPosition == word.length()) {
if(stariFinale.find(currentNode) != stariFinale.end()) {
return true;
}
}
for(const auto &neighbour: graf[currentNode]) {
if(neighbour.second == word[currentPosition]) {
nodes_to_visit.emplace(neighbour.first, currentPosition + 1);
}
}
nodes_to_visit.pop();
}
return false;
}
int main() {
std::ifstream fin("nfa.in");
std::ofstream fout("nfa.out");
int nrStari, nrTranzitii, nrStariFinale;
fin>>nrStari>>nrTranzitii>>nrStariFinale;
fin>>stareInitiala;
graf.resize(nrStari + 1);
for(int i = 0; i < nrStariFinale; i++) {
int stareFinala;
fin>>stareFinala;
stariFinale.insert(stareFinala);
}
for(int i = 0; i < nrTranzitii; i++) {
int x, y;
char l;
fin>>x>>y>>l;
graf[x].emplace_back(y, l);
}
int nrCuvinte;
fin>>nrCuvinte;
for(int i = 0; i < nrCuvinte; i++) {
std::string cuvant;
fin>>cuvant;
fout << isWordAccepted(cuvant) << '\n';
}
fin.close();
fout.close();
return 0;
}