Pagini recente » Cod sursa (job #702952) | Diferente pentru fmi-no-stress-2012/solutii/vmin intre reviziile 2 si 1 | somn | Diferente pentru problema/infasuratoare intre reviziile 43 si 44 | Cod sursa (job #2012068)
#include <stdio.h>
#include <ctype.h>
int v[27];
char aux[1003],s[1001],*p;
int eval()
{
int x=term();
while(*p=='|')
{
++p;
x|=term();
}
return x;
}
int term()
{
int x=nr();
while(*p=='&')
{
++p;
x&=nr();
}
return x;
}
int nr()
{
int rez=0,sgn=0;
while(*p=='-')
sgn=1-sgn,p++;
if(*p=='(')
{
++p;
rez=eval();
++p;
}
else
{
if(*p=='0' || *p=='1')
rez=*p-'0',p++;
else
{
p++;
rez=v[*(p-1)-'A'];
}
}
return sgn^rez;
}
int main()
{
int n,m,i;
char c;
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
n=0;
do
{
aux[n++]=getchar();
}while(aux[n-1]!='\n');
m=-1;
for(i=0; i<n;)
{
if(isalpha(aux[i]))
switch(aux[i])
{
case 'A': m++;
if(aux[i+1]=='N')
i+=3,s[m]='&';
else
i++,s[m]='A';
break;
case 'F': m++;
if(aux[i+1]=='A')
i+=5,s[m]='0';
else
i++,s[m]='F';
break;
case 'N': m++;
if(aux[i+1]=='O')
i+=3,s[m]='-';
else
i++,s[m]='N';
break;
case 'O': m++;
if(aux[i+1]=='R')
i+=2,s[m]='|';
else
i++,s[m]='O';
break;
case 'T': m++;
if(aux[i+1]=='R')
i+=4,s[m]='1';
else
i++,s[m]='T';
break;
default: s[++m]=aux[i++];
}
else
if(aux[i]=='(' || aux[i]==')')
s[++m]=aux[i++];
else
i++;
}
scanf("%d",&n);
getchar();
for(i=1; i<=n; i++)
{
c=getchar();
v[c-'A']=1-v[c-'A'];
p=s;
printf("%d",eval());
}
return 0;
}