Cod sursa(job #291235)

Utilizator 630r63Ilinca George Mihai 630r63 Data 29 martie 2009 16:12:48
Problema Episoade Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 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;
	vector<pair<int, int> > AB;
	int i, j, minim, maxim;

	r1 = termen();

	if (ok == false)
		return r1;


    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]];
    }

	AB.push_back(make_pair(minim, maxim));

	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;

		for (i = 0; i < AB.size(); ++i)
            for (j = 0; j < r2.size(); ++j)
                if (Poz[r2[j]] <= AB[i].second && Poz[r2[j]] >= AB[i].first){
                    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]);

        AB.push_back(make_pair(minim, maxim));
	}
	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);
	}
}