Pagini recente » Cod sursa (job #3350423) | Cod sursa (job #2209679) | Cod sursa (job #136550) | Cod sursa (job #871948) | Cod sursa (job #3326337)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
int v[333];
int Expresie(string &S,int &p);
int Termen_OR(string &S,int &p);
int Termen_AND(string &S,int &p);
int Expresie(string &S,int &p){
int ans = Termen_OR(S,p);
while (p<S.size() and S[p]=='|'){
p++;
ans = ans|Termen_OR(S,p);
}
return ans;
}
int Termen_OR(string &S,int &p){
int ans = Termen_AND(S,p);
while (p<S.size() and S[p]=='&'){
p++;
int loc = Termen_AND(S,p);
ans = ans&loc;
}
return ans;
}
int Termen_AND(string &S,int &p){
bool hasNOT = 0;
if (S[p]=='~'){
hasNOT = 1;
p++;
}
int val = 0;
//cout << p << '\n';
if (S[p]=='('){
p++;
val = Expresie(S,p);
p++;
}else{
if (S[p]=='0') val = 0;
else if (S[p]=='1') val = 1;
else val = v[S[p]];
p++;
}
if (hasNOT==1) val = 1-val;
return val;
}
signed main()
{
string init;
getline(fin,init);
string S;
int I = 0;
while (I<init.size()){
if (init[I]=='(' or init[I]==')'){
S = S+init[I];
I++;
}else if (init[I]>='A' and init[I]<='Z'){
if (init[I]=='T' and I+3<init.size() and init[I+1]=='R' and init[I+2]=='U' and init[I+3]=='E'){
S = S+"1";
I = I+4;
}else if (init[I]=='F' and I+4<init.size() and init[I+1]=='A' and init[I+2]=='L' and init[I+3]=='S' and init[I+4]=='E'){
S = S+"0";
I = I+5;
}else if (init[I]=='A' and I+2<init.size() and init[I+1]=='N' and init[I+2]=='D'){
S = S+"&";
I = I+3;
}else if (init[I]=='O' and I+1<init.size() and init[I+1]=='R'){
S = S+"|";
I = I+2;
}else if (init[I]=='N' and I+2<init.size() and init[I+1]=='O' and init[I+2]=='T'){
S = S+"~";
I = I+3;
}else{
S = S+init[I];
I++;
}
}else{
I++;
}
}
int q;
fin >> q;
while (q--){
char x;
fin >> x;
v[x] = 1-v[x];
int p = 0;
fout << Expresie(S,p);
}
return 0;
}