Pagini recente » Cod sursa (job #2400821) | Cod sursa (job #3229072) | Cod sursa (job #2748607) | Cod sursa (job #2719305) | Cod sursa (job #2935295)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
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 n,k;
int v[1005];
int Next[1005];
bool val[30];
char s[1005];
stack <int> st;
void build()
{
for(int i=0; s[i]!=0; i++)
{
if(s[i]=='(')
{
v[++k]=P1;
}
else if(s[i]==')')
{
v[++k]=P2;
}
else if(s[i]=='O' && s[i+1]=='R')
{
v[++k]=OR;
i++;
}
else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
{
v[++k]=AND;
i+=2;
}
else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
{
v[++k]=NOT;
i+=2;
}
else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
{
v[++k]=TRUE;
i+=3;
}
else if(s[i]>='A' && s[i]<='Z')
{
v[++k]=s[i]-'A';
}
}
for(int i=1; i<=k; i++)
{
if(v[i]==P1)st.push(i);
else if(v[i]==P2)
{
Next[st.top()]=i;
st.pop();
}
}
}
int solve(int st,int dr)
{
int a[1005];
int lg=0;
for(int i=st; i<=dr; i++)
{
if(v[i]>=0 && v[i]<=26)
{
a[++lg]=val[v[i]];
}
else if(v[i]==NOT)
{
if(v[i+1]>=0 && v[i+1]<=26)
{
a[++lg]=!val[v[i+1]];
}
else if(v[i+1]==P1)
{
int x=solve(i+2,Next[i+1]-1);
a[++lg]=!x;
i=Next[i+1];
}
}
else if(v[i]==P1)
{
int x=solve(i+1,Next[i]-1);
a[++lg]=x;
i=Next[i];
}
else if(v[i]==TRUE) a[++lg]=1;
else if(v[i]==FALSE) a[++lg]=0;
else if(v[i]!=P2) a[++lg]=v[i];
}
int lg2=0;
int b[1005];
for(int i=1;i<=lg;i++)
{
if(a[i]==0 || a[i]==1 || a[i]==OR)b[++lg2]=a[i];
else if(a[i]==AND)
{
b[lg2]=b[lg2]&a[i+1];
i++;
}
}
int ans=b[1];
for(int i=2;i<=lg2;i++)
{
if(b[i]==OR)
{
ans|=b[i+1];
i++;
}
}
return ans;
}
void read()
{
fin.getline(s,1005);
fin>>n;
char ch;
build();
for(int i=1; i<=n; i++)
{
fin>>ch;
val[ch-'A'] = !val[ch-'A'];
fout<<solve(1,n);
}
}
int main()
{
read();
return 0;
}