Pagini recente » runda/hoata3 | Cod sursa (job #1084627) | Cod sursa (job #3277276) | Cod sursa (job #122686) | Cod sursa (job #3216938)
#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 = std::vector<std::vector<std::pair<int, char>>>(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()) {
const std::pair<int, int> currentNode = nodes_to_visit.front();
nodes_to_visit.pop();
if(currentNode.second == word.length()) {
if (m_stariFinale.find(currentNode.first) != m_stariFinale.end()) {
return true;
}
}
for(const auto &it: m_graf[currentNode.first]) {
if(it.second == word[currentNode.second]) {
nodes_to_visit.emplace(it.first, currentNode.second + 1);
}
}
}
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;
}