Pagini recente » Cod sursa (job #2894561) | Cod sursa (job #2945687) | Cod sursa (job #341911) | Cod sursa (job #253925)
Cod sursa(job #253925)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
#define DEBUG
const int N_MAX = 110;
const int L_MAX = 2500;
string expr;
int n,t;
vector<int> q;
vector<int> G[N_MAX];
vector<int> repI[L_MAX];
vector<int> repO[L_MAX];
bool valid[N_MAX];
string::iterator cur;
int lanturi;
int lant[N_MAX];
void expresie ( int level, bool val );
void factor ( int level, bool val ) {
if (*cur == '(') {
++cur;
expresie(level,val);
++cur;
} else {
repI[level].clear();
repO[level].clear();
int nr;
for (nr = 0; '0' <= *cur && *cur <= '9'; ++cur)
nr = nr*10 + *cur - '0';
valid[nr] = val;
lant[nr] = lanturi;
repI[level].push_back(nr);
repO[level].push_back(nr);
}
}
void termen ( int level, bool val ) {
++lanturi;
int lanturi_loc = lanturi;
repI[level].clear();
repO[level].clear();
factor(level+1,val);
for (int i = 0; i < repI[level+1].size(); ++i)
repI[level].push_back(repI[level+1][i]);
int last = level+2;
int other = level+1;
while (*cur == '>') {
++cur;
factor(last,false);
for (int i = 0; i < repO[other].size(); ++i) {
for (int j = 0; j < repI[last].size(); ++j) {
if (repO[other][i] != repI[last][j]) {
G[repO[other][i]].push_back(repI[last][j]);
}
}
}
repO[other].resize(repO[last].size());
for (int i = 0; i < repO[last].size(); ++i) repO[other][i] = repO[last][i];
}
for (int i = 0; i < repO[other].size(); ++i)
repO[level].push_back(repO[other][i]);
for (int i = 0; i <= n; ++i)
if (lant[i] > lanturi_loc)
lant[i] = lanturi_loc;
}
vector<bool> check;
void expresie ( int level, bool val ) {
repI[level].clear();
repO[level].clear();
do {
if (*cur == '#') ++cur;
termen(level+1,val);
for (int i = 0; i < repI[level+1].size(); ++i)
repI[level].push_back(repI[level+1][i]);
for (int i = 0; i < repO[level+1].size(); ++i)
repO[level].push_back(repO[level+1][i]);
} while (*cur == '#');
for (int i = 0; i < repO[level].size(); ++i) {
for (int j = 0; j < repI[level].size(); ++j) {
if (lant[repI[level][j]] != lant[repO[level][i]]) {
G[repO[level][i]].push_back(repI[level][j]);
}
}
}
}
bool test ( vector<int> &q ) {
if (!valid[q[0]]) return false;
for (int i = 1; i < q.size(); ++i) {
bool ok = false;
for (int j = 0; j < G[q[i-1]].size(); ++j) {
if (G[q[i-1]][j] == q[i]) {
ok = true;
break;
}
}
if (!ok) return false;
}
return true;
}
int main() {
ifstream fin("episoade.in");
ofstream fout("episoade.out");
fin >> expr;
cur = expr.begin();
expr.push_back('!');
fin >> t >> n;
expresie(0,true);
q.resize(n);
for (; t; --t) {
for (int i = 0; i < n; ++i) fin >> q[i];
fout << (int)test(q) << '\n';
}
return 0;
}