Pagini recente » Cod sursa (job #3234408) | Cod sursa (job #2372762) | Cod sursa (job #276998) | Cod sursa (job #1337907) | Cod sursa (job #2545605)
#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() == '|') {
advance() ;
currVal |= andFactor() ;
advance() ;
}
return currVal ;
}
bool notFactor() {
bool currVal ;
if (currentChar() == '(') {
advance() ;
currVal = evaluate() ;
advance() ;
} else {
if (currentChar() == '0') {
advance() ;
currVal = 0 ;
} else if (currentChar() == '1') {
advance() ;
currVal = 1 ;
} else if (currentChar() == '!') {
advance() ;
currVal = !notFactor() ;
} else {
currVal = upd[currentChar() - 'A'] ;
advance() ;
}
}
return currVal ;
}
bool andFactor() {
bool currVal = notFactor() ;
while (currentChar() == '&') {
advance() ;
currVal &= notFactor() ;
advance() ;
}
return currVal ;
}
};
const int MV = 1e4 ;
bool isAlpha(char c) {
return ('A' <= c && c <= 'Z') ;
}
void create(char A[], char B[], int sz) {
int p(0) ;
for (int i = 0 ; i < sz ; ++ i) {
if (B[i] == '(' || B[i] == ')') {
A[p ++] = B[i] ;
} else if (B[i] == 'T' && B[i + 1] == 'R') {
A[p ++] = '1' ;
} else if (B[i] == 'F' && B[i + 1] == 'A') {
A[p ++] = '0' ;
} else if (B[i] == 'N' && B[i + 1] == 'O') {
A[p ++] = '!' ;
} else if (B[i] == 'A' && B[i + 1] == 'N') {
A[p ++] = '&' ;
} else if (B[i] == 'O' && B[i + 1] == 'R') {
A[p ++] = '|' ;
} else if (isAlpha(B[i]) && (!isAlpha(B[i - 1]) && !isAlpha(B[i + 1]))) {
A[p ++] = B[i] ;
}
}
for (int i = 0 ; i < p ; ++ i) {
std::cerr << A[i] << ' ' ;
}
}
int main() {
char S[MV + 5], ch ;
char B[MV + 5] ;
int p(0) ;
fgets(S, MV, in) ;
create(B, S, strlen(S)) ;
Expresion exp(B) ;
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()) ;
}
}