Cod sursa(job #253925)

Utilizator tvladTataranu Vlad tvlad Data 6 februarie 2009 13:38:53
Problema Episoade Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 2.75 kb
#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;
}