Pagini recente » Cod sursa (job #584394) | Cod sursa (job #1583297) | Cod sursa (job #149478) | Cod sursa (job #1953439) | Cod sursa (job #2368738)
//#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
#include <fstream>
ifstream cin("bool.in");
ofstream cout("bool.out");
char sir[1005];
vector < string > v;
bool val[30];
vector < string > st;
stack < int > stpar;
int cnt;
void read()
{
string c;
int len,i;
cin.getline(sir,1005);
len=strlen(sir);
for(i=0; i<len; i++)
{
if(sir[i]=='(' || sir[i]==')')
{
c=sir[i];
v.push_back(c);
}
else if(sir[i]=='O' && sir[i+1]=='R')
{
c="OR";
v.push_back(c);
i++;
}
else if(sir[i]=='N' && sir[i+1]=='O' && sir[i+2]=='T')
{
c="NOT";
v.push_back(c);
i+=2;
}
else if(sir[i]=='A' && sir[i+1]=='N' && sir[i+2]=='D')
{
c="AND";
v.push_back(c);
i+=2;
}
else if(sir[i]=='T' && sir[i+1]=='R' && sir[i+2]=='U' && sir[i+3]=='E')
{
c="TRUE";
v.push_back(c);
i+=3;
}
else if(sir[i]=='F' && sir[i+1]=='A' && sir[i+2]=='L' && sir[i+3]=='S' && sir[i+4]=='E')
{
c="FALSE";
v.push_back(c);
i+=4;
}
else if(sir[i]<='Z' && sir[i]>='A')
{
c=sir[i];
v.push_back(c);
}
}
v.push_back(")"); /// PENTRU FINALIZARE
}
bool neg(bool a)
{
return !a;
}
bool in(string a)
{
if(a=="TRUE")
return true;
else
return false;
}
string out(bool a)
{
if(a==true)
return "TRUE";
else
return "FALSE";
}
bool sau(bool a, bool b)
{
return a|b;
}
bool si(bool a, bool b)
{
return a&b;
//ai grija ca trebuie sa inlocuiesti & cu | si b cu false
}
void afis()
{
int i,j;
for(i=0; i<v.size(); i++)
cout<<v[i]<<endl;
}
void afis_stiva()
{
int i;
cout<<endl;
for(i=0; i<=cnt; i++)
cout<<st[i]<<" ";
cout<<endl;
}
void debugging()
{
int i;
cout<<endl;
for(i=0; i<=cnt; i++)
{
cout<<st[i]<<" "<<i<<endl;
}
cout<<endl;
}
void reset()
{
while(st.empty()==false)
st.pop_back();
while(stpar.empty()==false)
stpar.pop();
cnt=0;
}
void solve()
{
int i,j;
char c;
string h;
st.push_back(".");
st.push_back("(");
stpar.push(1);
cnt++;
for(i=0; i<v.size(); i++)
{
if(v[i]<="Z" && "A"<=v[i] && v[i].size()==1)
{
h=v[i];
c=h[0];
if(val[c-'A'+1]==true)
st.push_back("TRUE");
else
st.push_back("FALSE");
}
else
st.push_back(v[i]);
cnt++;
while(st[cnt-1]=="NOT")
{
st[cnt-1]=out(neg(in(st[cnt])));
cnt--;
st.pop_back();
}
if(st[cnt]=="(")
{
stpar.push(cnt);
}
if(st[cnt]==")" && stpar.empty()==false)
{
for(j=stpar.top()+1; j<cnt; j++)
{
if(st[j]=="AND")
{
st[j-1]=out(si(in(st[j-1]),in(st[j+1])));
st[j]="OR";
st[j+1]="FALSE";
}
}
for(j=stpar.top()+1; j<cnt; j++)
{
if(st[j]=="OR")
{
st[j+1]=out(sau(in(st[j-1]),in(st[j+1])));
st[j]="OR";
}
}
st[stpar.top()]=st[cnt-1];
while(st.empty()==false && cnt!=stpar.top())
{
st.pop_back();
cnt--;
}
stpar.pop();
}
}
if(st[1]=="TRUE")
cout<<1;
else
cout<<0;
//cout<<st[1];
//afis_stiva();
reset();
}
int main()
{
int n,i;
char c;
read();
//solve();
cin>>n;
for(i=1; i<=n; i++)
{
cin>>c;
if(val[c-'A'+1]==true)
val[c-'A'+1]=false;
else
val[c-'A'+1]=true;
solve();
}
return 0;
}