#include <stdio.h>
#define Nadejde 1005
#define SIGMA 26
#define FALSE 6
#define TRUE 5
#define NOT 4
#define AND 4
#define OR 3
#define S 2
/** Algoritm problema "Bool", autor Adrian Vladu:
* Gramtica expresiei este urmatoarea:
************************************************
* E = T | T or T | T or T or T | ...
* T = F | F and F | F and F and F | ...
* F = TRUE | FALSE | Majuscula | !F | (E)
************************************************
* Multumim Doamne!
**/
int N;
char *p; // copia sirului.
char s[Nadejde]; // sirul nostru.
int alpha[SIGMA]; // valorile majusculelor.
int E(); // antet expresie.
int T(); // antet termen.
int F(); // antet factor.
/** Evalueaza expresia. **/
int E() {
int result = T();
while ((p[0] == 'O') && (p[1] == 'R')) {
p += OR;
result |= T();
}
return result;
}
/** Evalueaza urmatorul termen. **/
int T() {
int result = F();
while ((p[0] == 'A') && (p[1] == 'N')) {
p += AND;
result &= F();
}
return result;
}
/** Evalueaza urmatorul factor. **/
int F() {
int result = 0;
if ((p[0] == 'N') && (p[1] == 'O')) {
p += NOT;
return !F();
} else if (p[0] == '(') {
p++;
result = E();
p++;
} else if ((p[0] == 'T') && (p[1] == 'R')) {
p += TRUE;
result = 1;
} else if ((p[0] == 'F') && (p[1] == 'A')) {
p += FALSE;
} else {
result = alpha[p[0] - 'A'];
p += S;
}
return result;
}
int main(void) {
FILE *in = fopen("bool.in", "r");
FILE *out = fopen("bool.out", "w");
/* Citeste sirul. */
fgets(s, Nadejde, in);
/* Raspunde la intrebari. */
fscanf(in, "%d\n", &N);
while (N--) {
char c = fgetc(in);
alpha[c - 'A'] = !alpha[c - 'A'];
p = s;
fprintf(out, "%d", E());
}
fclose(in);
fclose(out);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}