Pagini recente » Cod sursa (job #2066687) | Cod sursa (job #2823590) | Cod sursa (job #1360377) | Cod sursa (job #2907778) | Cod sursa (job #1576932)
#include <fstream>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005];
int n,a[1005],v[30],m,N,NEXT[1005];
stack <int> st;
const int NOT = -10;
const int TRUE = 100;
const int FALSE = 1000;
const int AND = -7;
const int OR = -6;
const int P1 = -1;
const int P2 = -2;
int Solve(int st, int dr)
{
int i,x,dim,D;
int b[1005];
int c[1005];
dim = 0;
for(i = st; i <= dr; ++i)
{
if(a[i]>=0 && a[i]<=26) b[++dim] = v[a[i]];
else if(a[i]==NOT)
{
if(a[i+1]>=0 && a[i+1]<=26) b[++dim] = !v[a[i+1]];
else if(a[i+1]==P1)
{
x = Solve(i+2,NEXT[i+1]);
b[++dim] = !x;
i = NEXT[i+1];
}
}
else if(a[i]==P1)
{
x = Solve(i+1,NEXT[i]);
b[++dim] = x;
i = NEXT[i];
}
else if(a[i]==TRUE) b[++dim] = 1;
else if(a[i]==FALSE) b[++dim] = 0;
else if(a[i]!=P2) b[++dim] = a[i];
}
D = 0;
for(i = 1; i <= dim; ++i)
{
if(b[i]==0 || b[i]==1) c[++D] = b[i];
else if(b[i]==AND && b[i+1]<=dim)
{
c[D] = c[D] & b[i+1];
i++;
}
else c[++D] = b[i];
}
x = c[1];
for(i = 2; i <= D; ++i)
if(c[i]==OR && i+1<=D) x = x|c[i+1],i++;
return x;
}
void Build()
{
int i;
for(i=0; s[i] ; ++i)
{
if(s[i]=='(') a[++N] = P1;
else if(s[i]==')') a[++N] = P2;
else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
{
a[++N] = AND;
i+=2;
}
else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
{
a[++N] = NOT;
i+=2;
}
else if(s[i]=='O' && s[i+1]=='R')
{
a[++N] = OR;
i++;
}
else if(s[i]=='T' && s[i+1]=='R')
{
a[++N] = TRUE;
i+=3;
}
else if(s[i]=='F' && s[i+1]=='A')
{
a[++N] = FALSE;
i+=4;
}
else if(s[i]>='A' && s[i]<='Z') a[++N] = s[i]-'A';
}
for(i=1;i<=N;++i)
{
if(a[i]==P1) st.push(i);
else if(a[i]==P2)
{
NEXT[st.top()] = i;
st.pop();
}
}
}
int main()
{
char x;
fin.getline(s,1005);
Build();
fin>>m;
for(int i = 1; i <= m; ++i)
{
fin>>x;
v[x-'A'] = !v[x-'A'];
fout<<Solve(1,N);
}
return 0;
}