Pagini recente » Cod sursa (job #2278789) | Cod sursa (job #2269250) | Cod sursa (job #1171804) | Cod sursa (job #1331051) | Cod sursa (job #2545584)
#include <bits/stdc++.h>
FILE *in = fopen("bool.in", "r"), *out = fopen("bool.out", "w") ;
int upd[30] ;
class Expresion {
private :
char *exp ;
int point ;
char currentChar() {
while (exp[point] == ' ') {
advance() ;
}
return exp[point] ;
}
void advance() {
point ++ ;
}
public :
__attribute__ ( (always_inline)) Expresion(char S[]) {
exp = S ;
point = 0 ;
}
void reset(int pos) {
this ->point = pos ;
}
bool evaluate() {
bool currVal = andFactor() ;
while (currentChar() == 'O') {
advance() ;
advance() ;
currVal |= andFactor() ;
advance() ;
}
return currVal ;
}
bool notFactor() {
bool currVal ;
if (currentChar() == '(') {
advance() ;
currVal = evaluate() ;
advance() ;
} else {
if (currentChar() == 'F' && exp[point + 1] == 'A') {
advance() ;
advance() ;
advance() ;
advance() ;
advance() ;
currVal = 0 ;
} else if (currentChar() == 'T' && exp[point + 1] == 'R') {
advance() ;
advance() ;
advance() ;
advance() ;
currVal = 1 ;
} else if (currentChar() == 'N' && exp[point + 1] == 'O') {
advance() ;
advance() ;
advance() ;
currVal = !notFactor() ;
} else {
currVal = upd[currentChar() - 'A'] ;
advance() ;
}
}
return currVal ;
}
bool andFactor() {
bool currVal = notFactor() ;
while (currentChar() == 'A') {
advance() ;
advance() ;
advance() ;
currVal &= notFactor() ;
advance() ;
}
return currVal ;
}
};
const int MV = 1e4 ;
int main() {
char S[MV + 5], ch ;
int p(0) ;
for (ch = fgetc(in) ; ch != '\n' ; ch = fgetc(in)) {
S[p ++] = ch ;
}
Expresion exp(S) ;
int q ;
fscanf(in, "%d\n", &q) ;
for (int i = 1 ; i <= q ; ++ i) {
ch = fgetc(in) ;
upd[ch - 'A'] ^= 1 ;
exp.reset(0) ;
fprintf(out, "%d", exp.evaluate()) ;
}
}