Cod sursa(job #2011880)
Utilizator | Data | 17 august 2017 14:11:51 | |
---|---|---|---|
Problema | Bool | Scor | 50 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 2.56 kb |
#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();
++p;
}
return x;
}
int term()
{
int x=nr();
while(*p=='&')
{
++p;
x&=nr();
++p;
}
return x;
}
int nr()
{
int rez=0,sgn=0;
if(*p=='-')
sgn=1,p++;
if(*p=='(')
{
++p;
rez=eval();
++p;
}
else
{
if(*p=='0' || *p=='1')
rez=*p-'0';
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;
}