Cod sursa(job #303148)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 9 aprilie 2009 16:35:38
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<algorithm>
using namespace std;

#define DIM 1001

int n,lg;
char s[DIM],aux[DIM],*p;

int eval1();
int eval2();

int eval0(){
	int rez=eval1();

	while(*p=='O'&&*(p+1)=='R'){
		p+=3;
		rez|=eval1();}
	return rez;}

int eval1(){
	int rez=eval2();

	while(*p=='A'&&*(p+1)=='N'){
		p+=4;
		rez&=eval2();}
	return rez;}

int eval2(){
	int rez;

	if(*p=='N'&&*(p+1)=='O'){
		p+=4;
		rez=!eval0();}
	else if(*p=='T'&&*(p+1)=='R'){
		p+=5;
		rez=1;}
	else if(*p=='F'&&*(p+1)=='A'){
		p+=6;
		rez=0;}
	else if(*p=='('){
		++p;
		rez=eval0();
		++p;}
	else{
		rez=*p-'0';
		p+=2;}
	return rez;}

int check(int x){

	if(isupper(s[x])){
		if(!x&&!isupper(s[x+1]))
			return 1;
		else if(x==lg-1&&!isupper(s[x-1]))
			return 1;
		else if(!isupper(s[x-1])&&!isupper(s[x+1]))
			return 1;}
	return 0;}

void solve(){
	int i,j;
	char ch;

	gets(s);
	lg=strlen(s);
	strcpy(aux,s);
	for(i=0; i<lg; ++i)
		if(check(i))
			aux[i]='0';
	scanf("%d\n",&n);
	for(i=0; i<n; ++i){
		scanf("%c",&ch);
		for(j=0; j<lg; ++j)
			if(s[j]==ch&&isdigit(aux[j]))
				aux[j]=!aux[j];
		p=aux;
		printf("%d",eval0());}}

int main(){

    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);

    solve();
    return 0;}