Cod sursa(job #794225)
#include <cstdio>
const int MAX_SIZE(1002);
const int MAX_MODIFY(102);
char expression [MAX_SIZE];
char modify [MAX_MODIFY];
bool values ['Z' + 1];
char *parser;
inline void read (void)
{
std::freopen("bool.in","r",stdin);
std::fgets(expression,MAX_SIZE,stdin);
int x;
std::scanf("%d\n%s",&x,modify);
std::fclose(stdin);
}
bool priority1 (void);
bool priority2 (void);
bool priority3 (void);
inline void skip (void)
{
while (*parser == ' ')
++parser;
}
bool priority1 (void)
{
bool result(priority2());
while (*parser == 'O' && parser[1] == 'R')
{
parser += 2;
result = result || priority2();
}
return result;
}
bool priority2 (void)
{
bool result(priority3());
while (*parser == 'A' && parser[1] == 'N')
{
parser += 3;
result = result && priority3();
}
return result;
}
bool priority3 (void)
{
bool result, negations(0);
skip();
while (*parser == 'N' && parser[1] == 'O')
{
++negations;
parser += 3;
skip();
}
if (*parser == '(')
{
++parser;
result = priority1();
++parser;
}
else
{
if (*parser == 'T' && parser[1] == 'R')
{
result = true;
parser += 4;
}
else if (*parser == 'F' && parser[1] == 'A')
{
result = false;
parser += 5;
}
else
{
result = values[*parser];
++parser;
}
}
if (negations % 2)
result = !result;
return result;
}
inline void print (void)
{
std::freopen("bool.out","w",stdout);
for (char *iterator(modify) ; *iterator ; ++iterator)
{
values[*iterator] = !values[*iterator];
parser = expression;
if (priority1())
std::putchar('1');
else
std::putchar('0');
}
std::putchar('\n');
std::fclose(stdout);
}
int main (void)
{
read();
print();
return 0;
}