Pagini recente » Cod sursa (job #2555605) | Cod sursa (job #585990) | Istoria paginii runda/jc2015-runda1/clasament | Cod sursa (job #1916379) | Cod sursa (job #3217180)
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>
#include <bitset>
#include <string>
#include <queue>
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 print(std::queue<int> coada, int nr) {
std::cerr << "Coada nr " << nr + 1 << '\n';
while (!coada.empty()) {
std::cerr << coada.front() << ' ', coada.pop();
}
std::cerr << '\n';
}
void Solve(std::string& cuv, int stare) {
std::cerr << cuv << '\n';
std::queue<int> stariCurente; stariCurente.push(stare);
for (int i = 0; i < (int) cuv.size(); i += 1) {
std::queue<int> stariObtinute;
while (!stariCurente.empty()) {
int stareCurenta = stariCurente.front();
for (int j = 0; j < (int) automat[stareCurenta].size(); j += 1)
if (automat[stareCurenta][j].second == cuv[i])
stariObtinute.push(automat[stareCurenta][j].first);
stariCurente.pop();
}
if (stariObtinute.empty()) {
fout << "0\n"; return ;
}
stariCurente = stariObtinute;
print(stariObtinute, i);
}
while (!stariCurente.empty()) {
int nodCurent = stariCurente.front();
if (stareFinala[nodCurent]) { fout << "1\n"; return; }
stariCurente.pop();
}
fout << "0\n";
}
int main() {
int n, m, k; fin >> n >> m >> k;
int stareInitiala; fin >> stareInitiala;
for (int i = 0; i < k; i += 1) {
int u; fin >> u; stareFinala[u] = true;
}
automat.assign(n + 1, std::vector<std::pair<int, char>> ());
for (int i = 0; i < m; i += 1) {
int u, v; char w; fin >> u >> v >> w;
automat[u].emplace_back(std::make_pair(v, w));
}
int nrCuv; fin >> nrCuv;
for (int i = 0; i < nrCuv; i += 1) {
std::string cuv; fin >> cuv;
Solve(cuv, stareInitiala);
}
return 0;
}