Pagini recente » Cod sursa (job #2764065) | Cod sursa (job #2930391) | Cod sursa (job #2987452) | Cod sursa (job #1730010) | Cod sursa (job #2863593)
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
string TRUE="TRUE";
string FALSE="FALSE";
string OR="OR";
string AND="AND";
string NOT="NOT";
int f[27];
string str;
int operation1(int val1, int val2, char operator1)
{
//cout<<val1<<" "<<val2<<endl;
if(operator1=='+')
return val1 or val2;
else if(operator1=='*')
return val1 and val2;
}
int degree(char operator1)
{
if(operator1=='+')
return 1;
else if(operator1=='*')
return 2;
else if(operator1=='!')
return 3;
return 0;
}
char form(int &i)
{
string newstr;
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
newstr.push_back(str[i]);
i++;
}
i--;
if(newstr==FALSE)
return '0';
else if(newstr==TRUE)
return '1';
else if(newstr==OR)
return '+';
else if(newstr==AND)
return '*';
else if(newstr==NOT)
return '!';
return str[i];
}
int eval(string &str)
{
stack<int>val;
stack<char>op;
for(int i=0;i<str.size();i++)
{
//cout<<i<<endl;
if(str[i]==' ')
continue;
else if(str[i]=='(')
{
op.push(str[i]);
}
else if(str[i]==')')
{
while(op.size()>0 and op.top()!='(')
{
char operator1=op.top();\
op.pop();
if(operator1=='!')
{
int val1=val.top();
val.pop();
val.push(!val1);
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
val.push(operation1(val1,val2,operator1));
}
}
op.pop();
}
else if(str[i]>='A' and str[i]<='Z')
{
char x=form(i);
//cout<<x<<endl;
if(x=='0' or x=='1')
{
//cout<<"DA@";
val.push(x-'0');
}
else if(x=='*' or x=='+' or x=='!')
{
while(op.size()>0 and degree(op.top())>=degree(x))
{
char operator1=op.top();
op.pop();
if(operator1=='!')
{
int val1=val.top();
val.pop();
val.push(!val1);
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
val.push(operation1(val1,val2,operator1));
}
}
op.push(x);
}
else if(x>='A' and x<='Z')
{
//cout<<"DA";
val.push(f[x-'A']);
}
}
}
while(op.size()>0)
{
char operator1=op.top();
op.pop();
if(operator1=='!')
{
int val1=val.top();
val.pop();
val.push(!val1);
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
val.push(operation1(val1,val2,operator1));
}
}
// cout<<"!";
return val.top();
}
int main()
{
int n;
getline(cin,str);
cin>>n;
for(int i=1;i<=n;i++)
{
char x;
cin>>x;
f[x-'A']^=1;
//cout<<f[x-'A']<<endl;
cout<<eval(str);
}
return 0;
}