Cod sursa(job #1110202)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 17 februarie 2014 21:20:48
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Lmax = 3000;
const int Sigma = 256;

char expr[Lmax + 1];
bool val[Sigma + 1];

int N, point;

bool eval_or();
bool eval_and();
bool termen();

bool termen()
{
    if ( expr[ point ] == 'N' && expr[ point + 1 ] == 'O' && expr[ point + 2 ] == 'T' )
    {
        point += 4;
        bool s = ( !termen() );
        return s;
    }

    if ( expr[ point ] == '(' )
    {
        point++;
        bool s = eval_or();
        point++;
        return s;
    }

    if ( expr[ point ] == 'T' && expr[ point + 1 ] == 'U' )
    {
        point += 4;
        return 1;
    }

    if ( expr[ point ] == 'F' && expr[ point + 1 ] == 'A' )
    {
        point += 5;
        return 0;
    }

    if ( 'A' <= expr[ point ] && expr[ point ] <= 'Z' )
    {
        point++;
        return val[ expr[ point - 1 ] ];
    }
}

bool eval_and()
{
    bool t = termen();

    while ( expr[ point + 1 ] == 'A' && expr[ point + 2 ] == 'N' && expr[ point + 3 ] == 'D' )
    {
        point += 5;
        t &= termen();
    }

    return t;
}

bool eval_or()
{
    bool t = termen();

    while ( expr[ point + 1 ] == 'O' && expr[ point + 2 ] == 'R' )
    {
        point += 4;
        t |= eval_and();
    }

    return t;
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    char c;

    gets( expr );

    scanf("%d\n", &N);

    for ( int i = 0; i < N; ++i )
    {
        scanf("%c", &c);

        val[ c ] ^= 1;

        point = 0;

        cout << eval_or();
    }

    return 0;
}