Pagini recente » Cod sursa (job #3037922) | Cod sursa (job #754348) | Cod sursa (job #1806890) | Cod sursa (job #2928376) | Cod sursa (job #2154464)
#include <bits/stdc++.h>
#define SIGMA 26
#define MAXLEN 1000
bool EXPR();
bool OR();
bool AND();
int last, len;
char v[1 + MAXLEN], w[1 + MAXLEN];
bool val[1 + SIGMA];
int pos;
bool EXPR(){
bool ans;
if(w[pos] == '('){
pos++;
ans = OR();
}
else if(w[pos] == 1 || w[pos] == 0){
ans = w[pos];
pos++;
}
else if(w[pos] == '~'){
pos++;
ans = 1 - EXPR();
}
else{
ans = val[w[pos] - 'A'];
pos++;
}
return ans;
}
bool AND(){
bool ans = EXPR();
while(pos <= last && w[pos] == '&'){
pos++;
ans &= EXPR();
}
return ans;
}
bool OR(){
bool ans = AND();
while(pos <= last && w[pos] == '|'){
pos++;
ans |= AND();
}
return ans;
}
int main(){
FILE*fi,*fo;
fi = fopen("bool.in","r");
fo = fopen("bool.out","w");
char c = fgetc(fi);
while(c != '\n'){
v[++len] = c;
c = fgetc(fi);
}
for(int i = 1; i <= len; i++){
if(v[i] == ' ') continue;
else if(v[i] == '(' || v[i] == ')') w[++last] = v[i];
else if(v[i + 1] < 'A' || 'Z' < v[i + 1]) w[++last] = v[i];
else if(v[i] == 'T' && v[i + 1] == 'R' && v[i + 2] == 'U' && v[i + 3] == 'E') w[++last] = 1, i = i + 3;
else if(v[i] == 'F' && v[i + 1] == 'A' && v[i + 2] == 'L' && v[i + 3] == 'S' && v[i + 4] == 'E') w[++last] = 0, i = i + 4;
else if(v[i] == 'N' && v[i + 1] == 'O' && v[i + 2] == 'T') w[++last] = '~', i = i + 2;
else if(v[i] == 'A' && v[i + 1] == 'N' && v[i + 2] == 'D') w[++last] = '&', i = i + 2;
else w[++last] = '|', i = i + 1;
}
int n;
fscanf(fi,"%d", &n);
c = fgetc(fi);
while(c < 'A' || c > 'Z') c = fgetc(fi);
for(int i = 1; i <= n; i++){
val[c - 'A'] ^= 1;
pos = 1;
fprintf(fo,"%d", OR());
c = fgetc(fi);
}
return 0;
}