Pagini recente » Cod sursa (job #1682606) | Cod sursa (job #2615641) | Cod sursa (job #1240637) | Cod sursa (job #2145620) | Cod sursa (job #2721004)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
/*
True -1
False -2
NOT -10
AND -100
OR -200
( -1000
) -2000
*/
char a[10005];
int fr[30];
int paranteze[10001];
int trans[10005];
int n;
int m;
int eval(int st, int dr)
{
int val[10005]= {0};
int x=0;
for(int i=st; i<=dr; ++i)
{
if(trans[i]==-10) ///not
{
if(trans[i+1]==-1000)
{
val[++x]=1-eval(i+3, paranteze[i+1]-1);
i=paranteze[i+1]+1;
}
else if(trans[i+1]>=0 && trans[i+1]<30)
{
val[++x]=1-fr[trans[i+1]];
i=i+2;
}
}
else if(trans[i]==-1)
val[++x]=1;
else if(trans[i]==-2)
val[++x]=0;
else if(trans[i]==-100)
val[++x]=-100;
else if(trans[i]==-200)
val[++x]=-200;
else if(trans[i]==-1000)
{
val[++x]=eval(i+1, paranteze[i]-1);
i=paranteze[i]+1;
}
else if(trans[i]>=0 && trans[i]<30)
val[++x]=fr[trans[i]];
}
int lung=0;
int ajut[10000]= {0};
for(int i=1; i<=x; ++i)
{
if(val[i]==0 || val[i]==1)
ajut[++lung]=val[i];
else if(val[i]==-100 )
{
ajut[lung]=ajut[lung]&val[i+1];
++i;
}
else
ajut[++lung]=val[i];
}
int v=ajut[1];
for(int i=2; i<=lung; ++i)
if(ajut[i]==-200 && i+1<=lung )
{
v=v|ajut[i+1];
++i;
}
return v;
}
int main()
{
f.getline(a,1005);
n=strlen(a);
int nr=0;
for(int i=0; i<n; ++i)
{
if(a[i]=='T' && a[i+1]=='R' && a[i+2]=='U' && a[i+3]=='E')
{
trans[++nr]=-1;
i+=4;
}
else if(a[i]=='F' && a[i+1]=='A' && a[i+2]=='L' && a[i+3]=='S' && a[i+4]=='E')
{
trans[++nr]=-2;
i+=5;
}
else if(a[i]=='N' && a[i+1]=='O' && a[i+2]=='T')
{
trans[++nr]=-10;
i+=3;
}
else if(a[i]=='A' && a[i+1]=='N' && a[i+2]=='D')
{
trans[++nr]=-100;
i+=3;
}
else if(a[i]=='O' && a[i+1]=='R')
{
trans[++nr]=-200;
i+=2;
}
else if(a[i]=='(')
trans[++nr]=-1000;
else if(a[i]==')')
trans[++nr]=-2000;
else if(a[i]>='A' && a[i]<='Z')
{
trans[++nr]=a[i]-'A';
}
}
for(int i=1;i<=nr;++i)
cout<<trans[i]<<" ";
cout<<"\n";
stack <int> par;
for(int i=1; i<=nr; ++i)
{
if(trans[i]==-1000)
par.push(i);
if(trans[i]==-2000)
{
paranteze[par.top()]=i;
par.pop();
}
}
for(int i=1; i<=n; ++i)
cout<<paranteze[i]<<" ";
f>>m;
for(int i=1; i<=m; ++i)
{
char c;
f>>c;
fr[c-'A']=1-fr[c-'A'];
g<<eval(1,n);
}
return 0;
}