Pagini recente » Cod sursa (job #2459271) | Cod sursa (job #2248854) | Cod sursa (job #2695996) | Cod sursa (job #2939589) | Cod sursa (job #84422)
Cod sursa(job #84422)
using namespace std;
#include<fstream>
char pol[1005];
int npol=0;
int v[30],q;
int is_alpha(char x)
{
return (x>='A'&&x<='Z');
}
int grad(char x)
{
if(x=='(') return 0;
if(x=='!') return 3;
if(x=='&') return 2;
if(x=='|') return 1;
return -1;
}
struct arb{char inf;arb* st,*dr;};
typedef arb* nod;
void go(nod x)
{
if(!(is_alpha(x->inf)||x->inf=='0'||x->inf=='1'))
{//e operator
if(x->inf=='!')
{
x->st=new arb;
x->st->inf=pol[--npol];
go(x->st);
}
else
{
x->st=new arb;
x->st->inf=pol[--npol];
go(x->st);
x->dr=new arb;
x->dr->inf=pol[--npol];
go(x->dr);
}
}
}
int eval(nod vf)
{
if(vf->inf=='1'||vf->inf=='0')
return q=(vf->inf-'0');
if(is_alpha(vf->inf))
return q=v[vf->inf-'A'+1];
if(vf->inf=='&')
return q=(eval(vf->st)&eval(vf->dr));
if(vf->inf=='|')
return q=(eval(vf->st)|eval(vf->dr));
return q=(eval(vf->st)^1);
}
int main()
{
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],oper[1000],op;
int i,noper=0;
oper[0]='(';
fin.get(s,1005);
pol[0]=' ';
for(i=0;s[i];i++)
if(s[i]!=' ')
{
if(s[i]=='(')
oper[++noper]='(';
else
if(s[i]==')')
{
while(oper[noper]!='(')
pol[++npol]=oper[noper--];
noper--;
}
else
if(is_alpha(s[i]))
{
if(is_alpha(s[i+1]))
{//e operator
if(s[i]=='N'||s[i]=='A'||s[i]=='O')
{
if(s[i]=='N')
op='!',i+=2;
else
if(s[i]=='A')
op='&',i+=2;
else
if(s[i]=='O')
op='|',i++;
//incerc sa bag in oper
//verific prioritati
if(grad(oper[noper])>grad(op))
{
while(grad(oper[noper])>grad(op))
{
pol[++npol]=oper[noper];
noper--;
}
oper[++noper]=op;
}
else
oper[++noper]=op;
}
else
{//e true sau false
if(s[i]=='F')
pol[++npol]='0',i+=4;
else
pol[++npol]='1',i+=3;
}
}
else
{//e variabila
pol[++npol]=s[i];
}
}
}
while(noper) pol[++npol]=oper[noper--];
pol[npol+1]=0;
//arboru
nod vf;
vf=new arb;
vf->inf=pol[npol];
pol[0]='.';
go(vf);
for(i=1;i<=26;i++) v[i]=0;
int n;
fin>>n;
fin.get();
fin.get(s,1005);
for(i=0;i<n;i++)
{
v[s[i]-'A'+1]^=1;
fout<<eval(vf);
}
fout<<"\n";
fin.close();
fout.close();
return 0;
}