Cod sursa(job #363442)
#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());
}
}