Cod sursa(job #2092107)

Utilizator inquisitorAnders inquisitor Data 20 decembrie 2017 23:53:37
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <algorithm>

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 %s", &queriesNumber, 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;
}