Pagini recente » Cod sursa (job #2008654) | Autentificare | Cod sursa (job #1079078) | Cod sursa (job #832456) | Cod sursa (job #2017202)
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <stack>
#include <vector>
using namespace std;
FILE *in,*out;
const int nmax = 1000;
char c[nmax+3];
map <string,bool> m;
struct Symbol
{
int tip;
string semn;
string val;
int prio;
} v[1+nmax];
int n;
void parsare()
{
int i = 0;
while(c[i] != '\0')
{
int iplus = 1;
if('A' <= c[i] && c[i] <= 'Z' && (c[i+1] < 'A' || c[i+1] > 'Z'))
{
v[++n].tip = 4;
v[n].val = string(1,c[i]);
m[v[n].val] = 0;
}
if(c[i] == '(')
v[++n].tip = 1;
if(c[i] == ')')
v[++n].tip = 2;
if(c[i] == 'N' && c[i+1] == 'O' && c[i+2] == 'T')
{
v[++n].tip = 4;
v[n].val = "TRUE";
v[++n].tip = 3;
v[n].semn = "NOT";
v[n].prio = 3;
iplus = 3;
}
if(c[i] == 'A' && c[i+1] == 'N' && c[i+2] == 'D')
{
v[++n].tip = 3;
v[n].semn = "AND";
v[n].prio = 2;
iplus = 3;
}
if(c[i] == 'O' && c[i+1] == 'R')
{
v[++n].tip = 3;
v[n].semn = "OR";
v[n].prio = 1;
iplus = 2;
}
if(c[i] == 'T' && c[i+1] == 'R')
{
v[++n].tip = 4;
v[n].val = "TRUE";
iplus = 4;
}
if(c[i] == 'F' && c[i+1] == 'A')
{
v[++n].tip = 4;
v[n].val = "FALSE";
iplus = 5;
}
i += iplus;
}
m["TRUE"] = 1;
m["FALSE"] = 0;
}
vector <int> output;
stack <int> opst;
void converttopostfix()
{
for(int i = 1; i <= n; i ++)
{
if(v[i].tip == 3)
{
while(0 < opst.size() && v[opst.top()].prio >= v[i].prio)
{
output.push_back(opst.top());
opst.pop();
}
opst.push(i);
}
if(v[i].tip == 1)
opst.push(i);
if(v[i].tip == 2)
{
while(v[opst.top()].tip != 1)
{
output.push_back(opst.top());
opst.pop();
}
opst.pop();
}
if(v[i].tip == 4)
output.push_back(i);
}
while(opst.size() > 0)
{
output.push_back(opst.top());
opst.pop();
}
}
bool calculate()
{
if(output.size() == 1)
return output[0];
else
{
int neval = 2;
bool eval[1+nmax];
eval[1] = m[v[output[0]].val];
eval[2] = m[v[output[1]].val];
for(int i = 2; i < output.size(); i ++)
{
if(v[output[i]].tip == 3)
{
if(v[output[i]].semn == "NOT")
{
eval[neval-1] = 1 - eval[neval];
neval --;
}
if(v[output[i]].semn == "AND")
{
eval[neval-1] = (eval[neval] && eval[neval-1]);
neval --;
}
if(v[output[i]].semn == "OR")
{
eval[neval-1] = (eval[neval] || eval[neval-1]);
neval --;
}
}
if(v[output[i]].tip == 4)
{
eval[++neval] = m[v[output[i]].val];
}
}
return eval[1];
}
}
const int nrmax = 100;
char k[nrmax+3];
int main()
{
in = fopen("bool.in","r");
out = fopen("bool.out","w");
fgets(c,nmax+3,in);
parsare();
converttopostfix();
int t;
fscanf(in,"%d\n",&t);
fgets(k,nrmax+3,in);
for(int i = 0; i < t; i ++)
{
m[string(1,k[i])] = 1 - m[string(1,k[i])];
fprintf(out,"%d",calculate());
}
return 0;
}