Pagini recente » Cod sursa (job #2452894) | Cod sursa (job #1588023) | Cod sursa (job #2090453) | Cod sursa (job #3813) | Cod sursa (job #938275)
Cod sursa(job #938275)
#include <fstream>
#include <cstring>
#include <stack>
#define In "bool.in"
#define Out "bool.out"
using namespace std;
bool lit[150];
stack<int>pa;
int n,na,a[1005],st[1005],vf;
char sir[1005],b[105],c[1005];
ofstream g(Out);
inline void Codif(char *s)
{
int na;
na = 0;
for(int i=0;s[i];)
{
if(s[i]==' ')
i++;
if(s[i]=='T'&&s[i+1]=='R')
{
c[++na] = '1';
i+=4;
continue;
}
if(s[i]=='F'&&s[i+1]=='A')
{
c[++na] ='0';
i+=5;
continue ;
}
if(s[i]=='N'&&s[i+1]=='O')
{
c[++na] ='n';
i+=3;
continue ;
}
if(s[i]=='A'&&s[i+1]=='N')
{
c[++na] ='a';
i+=3;
continue ;
}
if(s[i]=='O'&&s[i+1]=='R')
{
c[++na] ='o';
i+=2;
continue ;
}
c[++na] = s[i];
i++;
}
}
inline void Citire()
{
char sir[1005];
ifstream f(In);
f.getline(sir,1004);
Codif(sir);
f>>n;
f.get();
f.getline(b,104);
f.close();
}
inline void Preproc(char *s)
{
int i;
na = 0;
for(i=0;s[i];i++)
{
if(s[i]=='(')
{
a[++na] = -1;
continue;
}
if(s[i]==')')
{
a[++na] = -2;
continue;
}
if(s[i]=='a')
{
a[++na] = -3;
continue;
}
if(s[i]=='o')
{
a[++na] = -4;
continue;
}
if(s[i]=='n')
{
i++;
a[++na] = not(lit[int(s[i])]);
continue;
}
if(s[i]=='0'||s[i]=='1')
{
a[++na] = s[i]-'0';
continue;
}
a[++na] = lit[int(s[i])];
}
}
inline bool Rez(int s,int dr)
{
int i,j;
/*g<<"(";
for(i=s;i<=dr;i++)
g<<st[i]<<" ";
g<<")\n";*/
for(i=s+1;i<=dr;i+=2)
{
if(st[i]==-3)
st[i-1] = ((st[i-1])&(st[i+1]));
else
if(st[i]==-4)
st[i-1] = ((st[i-1])|(st[i+1]));
dr-=2;
for(j=i;j<=dr;j++)
st[j] = st[j+2];
i-=2;
}
return st[s];
}
inline void Afis()
{
int i;
for(i=1;i<=vf;i++)
g<<st[i]<<" ";
g<<"\n";
}
inline bool Eval()
{
int i;
vf = 0;
for(i=1;i<=na;i++)
{
if(a[i]==-1)
{
pa.push(vf+1);
continue;
}
if(a[i]==-2)
{
st[pa.top()] = Rez(pa.top(),vf);
vf = pa.top();
pa.pop();
continue;
}
st[++vf] = a[i];
}
return Rez(1,vf);
}
int main()
{
Citire();
int i;
for(i=0;i<n;i++)
{
lit[int(b[i])] = (not(lit[int(b[i])]));
Preproc(c+1);
g<<Eval();
}
g<<"\n";
g.close();
return 0;
}