Cod sursa(job #253698)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 6 februarie 2009 11:22:25
Problema Episoade Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 2.47 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

const int maxS = 1020;
const int maxN = 102;

int poz, len;
char s[maxS];
char A[maxN][maxN];
int V[maxN], Poz[maxN];
bool ok;

vector<int> expr();
vector<int> termen();
vector<int> factor();

vector<int> factor(){
	vector<int> r1;
	if (s[poz] == '('){
		++ poz;
		r1 = expr();
		++ poz;
		return r1;
	}
	int aux = 0;
	while (poz < len && s[poz] >= '0' && s[poz] <= '9')
		aux = aux * 10 + s[poz ++] - '0';
	r1.push_back(aux);
	return r1;
}
vector<int> termen(){
	vector<int> r1, r2;
	int i, j;
	
	r1 = factor();
	if (ok == false)
		return r1;
	while (poz < len && s[poz] == '>'){
		++poz;
		r2 = factor();	
		if (ok == false)
			return r1;
		for (i = 0; i < r1.size(); ++i)
			for (j = 0; j < r2.size(); ++j){
				A[r1[i]][r2[j]] = 1;
				A[r2[j]][r1[i]] = 2;
				if (Poz[r1[i]] > Poz[r2[j]]){
					//fprintf(stderr, "%d %d\n", r1[i], r2[j]);
					ok = false;
					return r1;
				}
			}
		for (j = 0; j < r2.size(); ++j)
			r1.push_back(r2[j]);
	}
	return r1;
}
vector<int> expr(){
	vector <int> r1, r2;
	int i, j, minim, maxim;
	
	r1 = termen();
	
	if (ok == false)
		return r1;
		
	while (poz < len && s[poz] == '#'){
		++poz;
		r2 = termen();
		
		if (ok == false)
			return r1;
		for (i = 0; i < r1.size(); ++i)
			for (j = 0; j < r2.size(); ++j)
				A[r1[i]][r2[j]] = A[r2[j]][r1[i]] = 3;
		minim = Poz[r1[0]]; maxim = Poz[r1[0]];
		
		for (i = 1; i < r1.size(); ++i){
			if (Poz[r1[i]] > maxim)
				maxim = Poz[r1[i]];
			if (Poz[r1[i]] < minim)
				minim = Poz[r1[i]];
		}
		//fprintf(stderr, "%d %d\n", minim, maxim);
		for (i = 0; i < r2.size(); ++i)
			if (Poz[r2[i]] <= maxim && Poz[r2[i]] >= minim){
				ok = false;
				return r1;
			}
		
		minim = Poz[r2[0]]; maxim = Poz[r2[0]];
		
		for (i = 1; i < r2.size(); ++i){
			if (Poz[r2[i]] > maxim)
				maxim = Poz[r2[i]];
			if (Poz[r2[i]] < minim)
				minim = Poz[r2[i]];
		}
		//fprintf(stderr, "%d %d\n", minim, maxim);
		for (i = 0; i < r1.size(); ++i)
			if (Poz[r1[i]] <= maxim && Poz[r1[i]] >= minim){
				ok = false;
				return r1;
			}
		
		for (j = 0; j < r2.size(); ++j)
			r1.push_back(r2[j]);
	}
	return r1;
}
int main(){
	int N, t, i, j;
	
	freopen("episoade.in", "r", stdin);
	freopen("episoade.out", "w", stdout);
	
	gets(s);
	poz = 0; len = strlen(s);
	
	scanf("%d%d", &t, &N);

	while (t--){
		for (i = 1; i <= N; ++i){
			scanf("%d", &V[i]);
			Poz[V[i]] = i;
		}
		ok = true; poz = 0;
		expr(); 
	
		printf("%d\n", (int) ok);
	} 
}