Cod sursa(job #307052)

Utilizator katakunaCazacu Alexandru katakuna Data 22 aprilie 2009 21:02:23
Problema Episoade Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
using namespace std;
#include <cstdio>
#include <vector>

#define Nmax 110

int n, m, a[Nmax], i, j, ok, T, p, poz[Nmax];
char v[1010];

vector <int> eval(), termen(), factor();

vector <int> eval(){

	vector <int> r, r2;
	vector < pair <int, int> > B;
	int i, pmin, pmax;
	r = termen();
	
	if( !ok ) return r;
	
	pmin = pmax = poz[r[0]];
	for(i = 1; i < (int)r.size(); i++){
			if(poz[r[0]] > pmax)
				pmax = poz[r[0]];
			
			if(poz[r[0]] < pmin)
				pmin = poz[r[0]];
	}
	
	B.push_back( make_pair(pmin, pmax) );
	
	while(v[p] == '#'){
		p++;
		r2 = termen();
		
		if( !ok ) return r;
		
		for(j = 0; j < (int)r2.size(); j++)
			for(i = 0; i < (int)B.size(); i++){
				if( poz[r2[j]] >= B[i].first && poz[r2[j]] <= B[i].second  )
					ok = 0;
			}		
		
		pmin = pmax = poz[r2[0]];
		for(i = 1; i < (int)r2.size(); i++){
			if(poz[r2[i]] > pmax)
				pmax = poz[r2[i]];
			
			if(poz[r2[i]] < pmin)
				pmin = poz[r2[i]];
		}
		
		for(i = 0 ; i < (int)r.size() ; i++)
			if( poz[r[i]] >= pmin && poz[r[i]] <= pmax )
				ok = 0;
		
		B.push_back( make_pair(pmin, pmax) );
		
		for(i = 0; i < (int)r2.size(); i++)
			r.push_back(r2[i]);
	}

	return r;
}

vector <int> termen(){

	vector <int> r, r2;
	r = factor();
	int rmax, r2min;
	
	if( !ok ) return r;
	
	while(v[p] == '>'){
		p++;
		r2 = factor();
		
		rmax = poz[r[0]];
		for(i = 1; i < (int)r.size(); i++)
			if( poz[r[i]] > rmax )
				rmax = poz[r[i]];
		
		if( !ok ) return r;
		
		r2min = poz[r2[0]];
		for(i = 1; i < (int)r2.size(); i++)
			if(poz[r2[i]] < r2min)
				r2min = poz[r2[i]];
		
		if(rmax > r2min) 
			ok = 0;
		
		for(i = 0; i < (int)r2.size(); i++)
			r.push_back(r2[i]);
		
	}

	return r;
}

vector <int> factor(){

	vector <int> r;
	
	if( !ok ) return r;
	
	if(v[p] == '('){
		p++;
		r = eval();
		p++;
		return r;
	}
	
	int nr = 0;
	for(; v[p] >= '0' && v[p] <= '9' ; p++)
		nr = nr * 10 + v[p] - '0';
	
	r.push_back(nr);
	return r;
}

int main(){

	FILE *f = fopen("episoade.in", "r");
	FILE *g = fopen("episoade.out", "w");

	fscanf(f,"%s",v);
	fscanf(f,"%d %d", &T, &n);
	
	for(; T ; T--){
		for(i = 1; i <= n; i++){
			fscanf(f,"%d", &a[i]);
			poz[a[i]] = i;
		}
		
		ok = 1; p = 0;
		eval();
		fprintf(g,"%d\n", ok);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;

}