Pagini recente » Cod sursa (job #3124119) | Cod sursa (job #2479534) | Cod sursa (job #592485) | Cod sursa (job #2963722) | Cod sursa (job #2852792)
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;
ifstream in ("bool.in");
ofstream out ("bool.out");
int n,m,lg;
int val[30],a[1005];
char v[1005],s[105];
stack <int> st;
int Next[1005];
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;
void read()
{
in.getline(v,1005);
n=strlen(v);
in>>m;
in>>s;
}
void precalc()
{
for(int i=0;i<n;i++)
{
if(v[i]=='(')
{
a[++lg]=P1;
}
else if (v[i]==')')
{
a[++lg]=P2;
}
else if(v[i]=='T' && v[i+1]=='R')
a[++lg]=TRUE,i+=3;
else if(v[i]=='F' && v[i+1]=='A') a[++lg]=FALSE,i+=4;
else if(v[i]=='N' && v[i+1]=='O') a[++lg]=NOT,i+=2;
else if(v[i]=='A' && v[i+1]=='N') a[++lg]=AND,i+=2;
else if(v[i]=='O' && v[i+1]=='R') a[++lg]=OR,i++;
else if(v[i]>='A' && v[i]<='Z') a[++lg]=v[i]-'A';
}
for(int i=1;i<=lg;i++)
{
if(a[i]==P1)
st.push(i);
else if (a[i]==P2){
Next[st.top()]=i;
st.pop();
}
}
}
int solve(int st,int dr)
{
int b[1005],c[1005],k=0,lung=0;
for(int i=st;i<=dr;i++)
{
if(a[i]>=0 && a[i]<=26)
b[++k]=val[a[i]];
if(a[i]==NOT)
{
if(a[i+1]>=0 && a[i+1]<=26)
b[++k]=!val[a[i+1]];
else if(a[i+1]==P1)
{
b[++k]=!solve(i+2,Next[i+1]);
i=Next[i+1];
}
}
else if(a[i]==P1)
{
b[++k]=solve(i+1,Next[i]);
i=Next[i];
}
else if(a[i]==TRUE) b[++k]=1;
else if(a[i]==FALSE) b[++k]=0;
else if(a[i]!=P2) b[++k]=a[i];
}
for(int i=1;i<=k;i++)
{
if(b[i]==0 || b[i]==1)
c[++lung]=b[i];
else if(b[i]==AND)
c[lung]=c[lung]&b[i+1];
else c[++lung]=b[i];
}
int x=c[1];
for(int i=1;i<=lung;i++)
{
if(c[i]==OR)
x=x|c[i+1];
}
return x;
}
int main()
{
read();
precalc();
for(int i=0;i<m;i++)
{
val[s[i]-'A']=!val[s[i]-'A'];
out<<solve(1,lg);
}
return 0;
}