Pagini recente » Cod sursa (job #2953288) | Cod sursa (job #452505) | Cod sursa (job #2747931) | Cod sursa (job #3140602) | Cod sursa (job #1035243)
#include <stdio.h>
#include <string.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 100
#define M 1000
char s[M+1];
int treel[2*M],treer[2*M],treeo[2*M];
int l,n,tlast=-1;
bool v[26];
int evaluate(int l,int r){
int tthis=++tlast;
if(s[l]==' ')++l;
if(s[r-1]==' ')--r;
if(s[l]=='('&&s[r-1]==')')
while(1){
int o=0,p=0;
fr(i,l+1,r-1){
if(s[i]=='(')++o;
else if(s[i]==')')--o;
if(o)p=1;
if(o==-1)break;
}
if(o==-1)break;
++l,--r;
if(!p)break;
}
int prio=-1;
int ln,rn;
fr(i,l,r){
if(s[i]==' '){}
else if(s[i]=='('){
int o=1;
while(o){
if(s[++i]=='(')++o;
else if(s[i]==')')--o;
}
}
else{
if(i+1<r&&s[i]=='O'&&s[i+1]=='R') prio=2,ln=i,rn=i+2;
else if(i+2<r&&s[i]=='A'&&s[i+1]=='N'&&prio<2) prio=1,ln=i,rn=i+3;
else if(i+3<r&&s[i]=='N'&&s[i+1]=='O'&&prio<1) prio=0,ln=i,rn=i+4;
}
}
if(prio==-1){
if(l+1==r)prio=5+s[l]-'A';
else if(s[l]=='T'&&s[l+1]=='R')prio=3;
else prio=4;
}
treeo[tthis]=prio;
if(prio<3)treer[tthis]=evaluate(rn,r);
if(prio&&prio<3)treel[tthis]=evaluate(l,ln);
return tthis;
}
bool evaltree(int i){
switch(treeo[i]){
case 0:return !evaltree(treer[i]);
case 1:return evaltree(treel[i])&&evaltree(treer[i]);
case 2:return evaltree(treel[i])||evaltree(treer[i]);
case 3:return true;
case 4:return false;
default: return v[treeo[i]-5];
}
}
int main(){
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
scanf("%[^\n]s",s);
l=strlen(s);
evaluate(0,l);
scanf("%i\n",&n);
char c;
fr(i,0,n){
scanf("%c",&c);
v[c-'A']=!v[c-'A'];
printf("%i",evaltree(0));
}
return 0;
}