Pagini recente » Cod sursa (job #2600002) | Cod sursa (job #463410) | Cod sursa (job #2701808) | Cod sursa (job #1783059) | Cod sursa (job #795685)
Cod sursa(job #795685)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char exp[1000], modif[100], expm[1000];
int n, var[256], c;
int eval();
int op_or();
int op_and();
int op_not();
int main()
{
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
cin.getline(exp, 2000);
scanf("%d", &n);
scanf("%s", modif);
int l = strlen(exp);
int j = 0;
for(int i=0;i<l;++i)
{
int ok = 0;
if(i < l-2 && exp[i] == 'N' && exp[i+1] == 'O' && exp[i+2] == 'T')
{
expm[j++] = '!';
ok = 1;
i += 2;
continue;
}
if(i < l-2 && exp[i] == 'A' && exp[i+1] == 'N' && exp[i+2] == 'D')
{
expm[j++] = '&';
ok = 1;
i += 2;
continue;
}
if(i < l-1 && exp[i] == 'O' && exp[i+1] == 'R')
{
expm[j++] = '|';
ok = 1;
i += 1;
continue;
}
if(i < l-3 && exp[i] == 'T' && exp[i+1] == 'R' && exp[i+2] == 'U' && exp[i+3] == 'E')
{
expm[j++] = 't';
ok = 1;
i += 3;
continue;
}
if(i < l-4 && exp[i] == 'F' && exp[i+1] == 'A' && exp[i+2] == 'L' && exp[i+3] == 'S' && exp[i+4] == 'E')
{
expm[j++] = 'f';
ok = 1;
i += 4;
continue;
}
if(exp[i] == ' ')
{
continue;
}
if(!ok)
{
expm[j++] = exp[i];
}
}
memset(var, 0, 256);
var['t'] = 1;
for(int i=0;i<n;++i)
{
var[modif[i]] = 1-var[modif[i]];
c = 0;
printf("%d", eval());
}
//printf("%s", expm);
return 0;
}
int eval()
{
int rez = op_or();
while(expm[c] == '|')
{
++c;
rez += op_or();
}
return rez > 0 ? 1 : 0;
}
int op_or()
{
int rez = op_and();
while(expm[c] == '&')
{
++c;
rez *= op_and();
}
return rez;
}
int op_and()
{
int neg = 0;
while(expm[c] == '!')
{
++c;
++neg;
}
if(neg % 2 == 0)
return op_not();
return 1-op_not();
}
int op_not()
{
int rez;
if(expm[c] == '(')
{
c++;
rez = eval();
c++;
}
else
{
rez = var[expm[c]];
++c;
}
return rez;
}