Pagini recente » Cod sursa (job #2354155) | Cod sursa (job #1337710) | Cod sursa (job #449632) | Cod sursa (job #2665929) | Cod sursa (job #301718)
Cod sursa(job #301718)
#include <cstdio>
#include <cstring>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN "bool.in"
#define OUT "bool.out"
int N,hmax = 3;
char *p,A[1<<10],S[1<<10];
char V[1<<10];
void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
fgets(A,1<<10,stdin);
scanf("%d\n",&N);
fgets(S,1<<10,stdin);
}
int operatie(bool a,bool b,char c)
{
switch(c)
{
case '&' : return a & b;
case '|' : return a | b;
case '!' : return !a;
}
return 0;
}
int eval(int);
int element()
{
int r=0;
if ( *p == '(' )
{
++p;
r = eval(0);
++p;
}
else
{
if(*p >= 'A' && *p <= 'Z')
r = V[(int)*p],++p;
}
return r;
}
int eval(int h)
{
int r = (h==hmax)?element():eval(h+1);
while(strchr("&!|", *p) )
r = operatie(r, eval(h+1), *(++p-1));
return r;
}
void solve()
{
int j(-1);
for(int i=A[0];A[i] != '\n' && A[i] != '\0';++i)
{
if(A[i] == 'A' && A[i+1] == 'N')
{
A[++j] = '&';
i += 2;
continue;
}
if(A[i] == 'O' && A[i+1] == 'R')
{
A[++j] = '|';
i += 1;
continue;
}
if(A[i] == 'N' && A[i+1] == 'O')
{
A[++j] = '!';
i += 2;
continue;
}
A[++j] = A[i];
}
FOR(i,0,N-1)
{
p = A;
V[ (int)S[i] ] = !V[ (int)S[i] ];
printf("%d",eval(0) );
}
}
int main()
{
scan();
solve();
return 0;
}