Pagini recente » Cod sursa (job #2241961) | Cod sursa (job #3246881) | Cod sursa (job #2500270) | Istoria paginii racovita_mini_vacanta_11_12 | Cod sursa (job #3216955)
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <vector>
class NFA {
public:
NFA() = default;
~NFA() = default;
void citesteNMK(std::ifstream &fin);
bool isAccepted(const std::string &word);
private:
std::vector<std::vector<std::pair<int, char>>> m_graf;
std::unordered_set<int> m_stariFinale;
int m_stareInitiala;
};
void NFA::citesteNMK(std::ifstream &fin) {
int n,m,k;
fin>>n>>m>>k;
m_graf.resize(n+1);
fin>>m_stareInitiala;
for(int i = 0; i < k; i++) {
int sf;
fin>>sf;
m_stariFinale.insert(sf);
}
for(int i = 0; i < m; i++) {
int x, y;
char l;
fin>>x>>y>>l;
m_graf[x].emplace_back(y, l);
}
}
bool NFA::isAccepted(const std::string &word) {
std::queue<std::pair<int, int>> nodes_to_visit;
nodes_to_visit.emplace(m_stareInitiala, 0);
while(!nodes_to_visit.empty()) {
//(nod, pozitie_in_cuvant)
std::pair<int, int> currentNode = nodes_to_visit.front();
if(currentNode.second == word.length()) {
if(m_stariFinale.find(currentNode.first) != m_stariFinale.end()) {
return true;
}
}
for(const auto &node: m_graf[currentNode.first]) {
if(node.second == word[currentNode.second]) {
nodes_to_visit.emplace(node.first, currentNode.second + 1);
//printf("De la nodul %d ma duc la nodul %d\n", currentNode.first, node.first);
}
}
nodes_to_visit.pop();
}
return false;
}
int main() {
std::ifstream fin("nfa.in");
std::ofstream fout("nfa.out");
NFA nfa;
nfa.citesteNMK(fin);
int nrCuvinte;
fin>>nrCuvinte;
for(int i = 0; i < nrCuvinte; i++) {
std::string cuvant;
fin>>cuvant;
bool wasAccepted = nfa.isAccepted(cuvant);
fout<<wasAccepted<<'\n';
}
fin.close();
fout.close();
return 0;
}