Cod sursa(job #363442)

Utilizator undogSavu Victor Gabriel undog Data 13 noiembrie 2009 11:25:40
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <cstdio>
#include <cstring>

bool mat[256];
char msg[1000];

class expression{
	public:
		virtual bool evaluate()=0;
};

class operation : public expression{
	public:
		bool evaluate(){
			switch(op){
				case '*': return l->evaluate()&&r->evaluate();
				case '+': return l->evaluate()||r->evaluate();
			}
		}
		char op;
		expression *l,*r;
};

class negation : public expression{
	public:
		bool evaluate(){
			return !(w->evaluate());
		}
		expression *w;
};

class constant : public expression{
	public:
		bool evaluate(){
			return val;
		}
		bool val;
};

class variable : public expression{
	public:
		bool evaluate(){
			return mat[var];
		}
		char var;
};

expression* root;

expression* parse(int s,int e){
		int i,p=0;
		if(msg[s]=='('){
			for(i=s;i<=e;i++)
				if(msg[i]=='(')
					p++;
				else if(msg[i]==')'){
					p--;
					if(p==0) 
						break;
				}
			if(i==e)
				return parse(s+1,e-1);
		}
		
		for(i=s;i<=e;i++)
			if(msg[i]=='(')
				p++;
			else if(msg[i]==')')
				p--;
			else if(p==0&&msg[i]=='+'){
				operation* me=new operation;
				me->l=parse(s,i-1);
				me->r=parse(i+1,e);
				me->op='+';
				return me;
			}
		for(i=s;i<=e;i++)
			if(msg[i]=='(')
				p++;
			else if(msg[i]==')')
				p--;
			else if(p==0&&msg[i]=='*'){
				operation* me=new operation;
				me->l=parse(s,i-1);
				me->r=parse(i+1,e);
				me->op='*';
				return me;
			}
		if(msg[s]=='!'){
			negation* me=new negation;
			me->w=parse(s+1,e);
			return me;
		}
		if(msg[s]=='1'){
			constant* me=new constant;
			me->val=true;
			return me;
		}
		if(msg[s]=='0'){
			constant* me=new constant;
			me->val=false;
			return me;
		}
		variable* me=new variable;
		me->var=msg[s];
		return me;
}

int main(){
	freopen("bool.in","rt",stdin);
	freopen("bool.out","wt",stdout);
	
	int n;
	fgets(msg,1000,stdin);
	scanf("%d",&n);
	
	int i,j;
	for(i=0,j=0;i<strlen(msg);i++)
		if(msg[i]!=' ')
			msg[j++]=msg[i];
	msg[j]=0;
	
	for(i=0,j=0;i<strlen(msg);i++)
		if(msg[i]=='A'&&msg[i+1]=='N'&&msg[i+2]=='D'){
			msg[j++]='*';
			i+=2;
		}
		else if(msg[i]=='O'&&msg[i+1]=='R'){
			msg[j++]='+';
			i++;
		}
		else if(msg[i]=='N'&&msg[i+1]=='O'&&msg[i+2]=='T'){
			msg[j++]='!';
			i+=2;
		}
		else if(msg[i]=='T'&&msg[i+1]=='R'&&msg[i+2]=='U'&&msg[i+3]=='E'){
			msg[j++]='1';
			i+=3;
		}
		else if(msg[i]=='F'&&msg[i+1]=='A'&&msg[i+2]=='L'&&msg[i+3]=='S'&&msg[i+4]=='E'){
			msg[j++]='0';
			i+=4;
		}
		else
			msg[j++]=msg[i];
	
	msg[j-1]=0;
	root=parse(0,strlen(msg)-1);
	
	char a;
	scanf("%c",&a);
	
	while(n--){
		scanf("%c",&a);
		mat[a]=!mat[a];
		printf("%d",root->evaluate());
	}
	
}