Cod sursa(job #377604)
#include<stdio.h>
char s[1001],chng[1001];
int i;
bool flg[1001];
bool RSolve(int pos,int sw)
{
bool swch=(sw&1);
bool rez=0;
bool NvalOVR=0;
short crnt_op=0;
for(i=pos;s[i];++i)
{
if(s[i]=='(')
{
++i;
if(NvalOVR)
switch(crnt_op)
{
case 0:rez=!RSolve(i,sw);break;
case 1:rez&=!RSolve(i,sw);break;
case 2:rez|=!RSolve(i,sw);break;
}
else
switch(crnt_op)
{
case 0:rez=RSolve(i,sw);break;
case 1:rez&=RSolve(i,sw);break;
case 2:rez|=RSolve(i,sw);break;
}
NvalOVR=0;
}
if(s[i]==')')
{
++i;
return rez;
}
if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]==chng[sw])
flg[i]=!flg[i];
if(s[i+1]&&s[i+1]>='A'&&s[i+1]<='Z')
{
if(s[i]=='N')
{
i+=2;
NvalOVR=1;
continue;
}
if(s[i]=='A')
{
i+=2;
crnt_op=1;
continue;
}
if(s[i]=='O')
{
++i;
crnt_op=2;
continue;
}
if(s[i]=='T')
{
i+=3;
if(NvalOVR)
switch(crnt_op)
{
case 0:rez=!(1>swch)?1:0;break;
case 1:rez&=!(1>swch)?1:0;break;
case 2:rez|=!(1>swch)?1:0;break;
}
else
switch(crnt_op)
{
case 0:rez=(1>swch)?1:0;break;
case 1:rez&=(1>swch)?1:0;break;
case 2:rez|=(1>swch)?1:0;break;
}
}
if(s[i]=='F')
{
i+=3;
if(NvalOVR)
switch(crnt_op)
{
case 0:rez=!(0>swch)?1:0;break;
case 1:rez&=!(0>swch)?1:0;break;
case 2:rez|=!(0>swch)?1:0;break;
}
else
switch(crnt_op)
{
case 0:rez=(0<swch)?1:0;break;
case 1:rez&=(0<swch)?1:0;break;
case 2:rez|=(0<swch)?1:0;break;
}
}
}
else
{
if(NvalOVR)
switch(crnt_op)
{
case 0:rez=!(1&flg[i]);break;
case 1:rez&=!(1&flg[i]);break;
case 2:rez|=!(1&flg[i]);break;
}
else
switch(crnt_op)
{
case 0:rez=(1&flg[i]);break;
case 1:rez&=(1&flg[i]);break;
case 2:rez|=(1&flg[i]);break;
}
NvalOVR=0;
}
}
}
return rez;
}
int main()
{
int nch=0;
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
gets(s);
scanf("%d\n",&nch);
gets(chng);
for(int j=0;j<nch;++j)
printf("%d",RSolve(0,j));
}