Pagini recente » Cod sursa (job #1725614) | Cod sursa (job #718864) | Cod sursa (job #3153721) | Statistici Zoltan Czako (UniversitateaTehnica_Zoltan_Czako) | Cod sursa (job #2092104)
#include <cstdio>
#include <algorithm>
using namespace std;
char line[1001], expression[1001], queries[101], *p = expression;
bool variablePositions[26][1001], Evaluate(), OrTerm(), AndTerm();
int queriesNumber;
int main()
{
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
scanf("%[^\n]", line);
for(int i = 0, j = -1; line[i]; i++)
{
if(line[i] == ' ') continue;
if(line[i] == 'N' && line[i+1] == 'O') expression[++j] = '~', i += 2;
else if(line[i] == 'A' && line[i+1] == 'N') expression[++j] = '&', i += 2;
else if(line[i] == 'O' && line[i+1] == 'R') expression[++j] = '|', i += 1;
else if(line[i] == 'T' && line[i+1] == 'R') expression[++j] = '1', i += 3;
else if(line[i] == 'F' && line[i+1] == 'A') expression[++j] = '0', i += 4;
else if(isalpha(line[i])) variablePositions[line[i] - 'A'][++j] = 1, expression[j] = '0';
else expression[++j] = line[i];
}
scanf("%d", &queriesNumber);
scanf("%s", queries);
for(int i = 0; queries[i]; i++)
{
for(int j = 0; expression[j]; j++)
{
if(variablePositions[queries[i] - 'A'][j])
{
expression[j] = '0' + '1' - expression[j];
}
}
printf("%d", Evaluate());
p = expression;
}
return 0;
}
bool Evaluate()
{
bool result = OrTerm();
while(*p == '|') p++, result |= OrTerm();
return result;
}
bool OrTerm()
{
bool result = AndTerm();
while(*p == '&') p++, result &= AndTerm();
return result;
}
bool AndTerm()
{
bool result;
if(*p == '~') p++, result = !AndTerm();
if(*p == '0') result = 0, p++;
if(*p == '1') result = 1, p++;
if(*p == '(') p++, result = Evaluate(), p++;
return result;
}