#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME "bool"
#define FILES true
#define LMAX 1000
#define CMAX 256
char s[LMAX + 2], val[CMAX];
char tok[LMAX + 1];
int sp;
int expr();
int orl();
int andl();
int expr()
{
int retval = orl();
while (tok[sp] == '|') {
++sp;
retval = (retval | orl());
}
return retval;
}
int orl()
{
int retval = andl();
while (tok[sp] == '&') {
++sp;
retval = (retval & andl());
}
return retval;
}
int andl()
{
int retval = 0;
if (tok[sp] == '(') {
++sp;
retval = expr();
++sp;
} else if (tok[sp] == '0') {
retval = 0;
++sp;
} else if (tok[sp] == '1') {
retval = 1;
++sp;
} else if ('A' <= tok[sp] && tok[sp] <= 'Z') {
retval = val[tok[sp]];
++sp;
} else if (tok[sp] == '!') {
++sp;
retval = 1 - andl();
}
return retval;
}
int main()
{
FILE *fin, *fout;
fin = FILES ? fopen(NAME".in", "r") : stdin;
fout = FILES ? fopen(NAME".out", "w") : stdout;
// Citire expresie
fgets(s, LMAX, fin);
int len = strlen(s) - 1;
// Transformare expresie in tokeni
int toklen = 0;
int t = 0;
while (t < len) {
if (s[t] == '(' || s[t] == ')') {
tok[toklen++] = s[t];
++t;
} else if (s[t] == ' ' || s[t] == '\n') {
++t;
} else if (s[t + 1] == ' ' || s[t + 1] == ')' || s[t + 1] == '\n') {
tok[toklen++] = s[t];
++t;
} else {
if (s[t] == 'A') {
t += 3;
tok[toklen++] = '&';
} else if (s[t] == 'O') {
t += 2;
tok[toklen++] = '|';
} else if (s[t] == 'N') {
t += 3;
tok[toklen++] = '!';
} else if (s[t] == 'T') {
t += 4;
tok[toklen++] = '1';
} else if (s[t] == 'F') {
t += 5;
tok[toklen++] = '0';
} else {
printf("Houston, we have a problem!\n");
exit(1);
}
}
}
//for (int i = 0; i < toklen; ++i) {
// printf("%c", tok[i]);
//}
int N;
fscanf(fin, "%d", &N);
fgetc(fin);
for (int i = 0; i < N; ++i) {
char read = fgetc(fin);
val[read] = 1 - val[read];
// Afisare
sp = 0;
fprintf(fout, "%d", expr());
}
fclose(fin);
fclose(fout);
return 0;
}