Pagini recente » Cod sursa (job #1194918) | Cod sursa (job #1045795) | Cod sursa (job #1129820) | Cod sursa (job #2232667) | Cod sursa (job #3217176)
//
///* Implementare automat finit nedeterminist */
//
//#include <fstream>
//#include <climits>
//#include <utility>
//#include <vector>
//#include <bitset>
//#include <string>
//#include <queue>
//
//std::ifstream fin("input.txt");
//std::ofstream fout("output.txt");
//
//const int nMax = (int) 1e6;
//
//std::bitset<nMax> stareFinala;
//
//std::vector<int> stari;
//std::vector<std::vector<std::pair<int, char>>> automat;
//
//void Solve(std::string& cuvant, int stareaInitiala) {
// std::queue<int> coada; coada.push(stareaInitiala);
//
// for (int i = 0; i < (int) cuvant.size(); i += 1) {
// std::queue<int> stariObtinute;
// while (!coada.empty()) {
// int stareCurenta = coada.front();
// for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
// if (automat[stareCurenta][j].second == cuvant[i])
// stariObtinute.push(automat[stareCurenta][j].first);
// coada.pop();
// }
//
// if (stariObtinute.empty()) {
// fout << "NU\n";
// return;
// }
//
// coada = stariObtinute;
// }
//
// while (!coada.empty()) {
// int stare = coada.front();
// if (stareFinala[stare]) {
// fout << "DA\n";
// return;
// }
// coada.pop();
// }
//
// fout << "NU\n";
//}
//
//int main() {
// int n, Min = INT_MAX; fin >> n;
// stari.resize(n);
// for (int i = 0; i < n; i += 1) {
// fin >> stari[i];
// Min = std::min(Min, stari[i]);
// }
//
// if (Min < 0)
// for (int i = 0; i < n; i += 1)
// stari[i] -= Min;
//
// int Max = INT_MIN;
// for (int i = 0; i < n; i += 1)
// Max = std::max(Max, stari[i]);
//
//
// automat.assign(Max + 1, std::vector<std::pair<int, char>> ());
//
//
// int m; fin >> m;
// for (int i = 0; i < m; i += 1) {
// int u, v; char w; fin >> u >> v >> w;
// if (Min < 0) u -= Min, v -= Min;
//
//
// automat[u].emplace_back(std::make_pair(v, w));
// }
//
// int stareaInitiala; fin >> stareaInitiala;
// if (Min < 0) stareaInitiala -= Min;
//
// int nrStariFinale; fin >> nrStariFinale;
// for (int i = 0; i < nrStariFinale; i += 1) {
// int u; fin >> u;
// if (Min < 0) u -= Min;
//
// stareFinala[u] = true;
// }
//
// int nrCuvinte; fin >> nrCuvinte;
// for (int i = 0; i < nrCuvinte; i += 1) {
// std::string cuvant; fin >> cuvant;
// Solve(cuvant, stareaInitiala);
// }
// return 0;
//}
#include <fstream>
#include <utility>
#include <vector>
#include <queue>
#include <bitset>
std::ifstream fin("nfa.in");
std::ofstream fout("nfa.out");
const int nMax = 301;
std::bitset<nMax> stareFinala;
std::vector<std::vector<std::pair<int, char>>> automat;
void Solve(std::string& cuvant, int stareInitiala) {
std::queue<int> coada; coada.push(stareInitiala);
for (int i = 0; i < (int) cuvant.size(); i += 1) {
std::queue<int> stariObtinute;
while (!coada.empty()) {
int stareCurenta = coada.front();
for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
if (automat[stareCurenta][j].second == cuvant[i])
stariObtinute.push(automat[stareCurenta][j].first);
coada.pop();
}
if (stariObtinute.empty()) {
fout << "NU\n";
return;
}
coada = stariObtinute;
}
while (!coada.empty()) {
int stare = coada.front();
if (stareFinala[stare]) {
fout << "DA\n";
return;
}
coada.pop();
}
fout << "NU\n";
}
int main() {
int n, m, k; fin >> n >> m >> k;
int stareInitiala; fin >> stareInitiala;
for (int i = 0; i < k; i += 1) {
int stare; fin >> stare;
stareFinala[stare] = true;
}
automat.assign(n + 1, std::vector<std::pair<int, char>> ());
for (int i = 0; i < n; i += 1) {
int u, v; char w; fin >> u >> v >> w;
automat[u].emplace_back(std::make_pair(v, w));
}
int nrCuvinte; fin >> nrCuvinte;
for (int i = 0; i < nrCuvinte; i += 1) {
std::string cuvant; fin >> cuvant;
Solve(cuvant, stareInitiala);
}
return 0;
}