Cod sursa(job #870841)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 3 februarie 2013 23:49:19
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
using namespace std;
ifstream f ( "bool.in" );
ofstream g ( "bool.out" );
#include <string>
#define LE 6666
string S;
string str;
int i, t, A[LE], K;
int n;
bool lev1(), lev2(), lev3();
char CH;
bool fr[LE];
int main()
{

    getline ( f, S );
    int N = S.length();

    for ( i = 0; i < N; ++i )
    {
        if ( S[i] == ' ' ) continue;

        if ( i + 1 < N && S[i] >= 'A' && S[i] <= 'Z' && S[i+1] >= 'A' && S[i+1] <= 'Z' )
        {
            str = "";

            for ( ; i < N && S[i] >= 'A' && S[i] <= 'Z'; ++i ) str += S[i];

            if ( str == "OR" )  A[++K] = '|';

            if ( str == "AND" ) A[++K] = '&';

            if ( str == "NOT" ) A[++K] = '!';

            if ( str == "TRUE" ) A[++K] = 'a';

            if ( str == "FALSE" ) A[++K] = 'b';

            --i;
            continue;
        }

        if ( S[i] == '(' || S[i] == ')' ) A[++K] = S[i];

        if ( S[i] >= 'A' && S[i] <= 'Z' )
            A[++K] = S[i];
    }

    f >> n;
    f.get();
    fr['a'] = true, fr['b'] = false;

    for ( t = 1; t <= n; ++t )
    {
        f >> CH;
        fr[CH] = !fr[CH];
        i = 1;
        g << lev1();
    }


    f.close();
    g.close();
    return 0;
}
bool lev1()
{
    if ( A[i] == '(' ) ++i;

    bool result = lev2();

    while ( i <= K && A[i] == '|' )
    {
        ++i;
        result |= lev2();
    }

    ++i;
    return result;
}
bool lev2()
{
    bool result = lev3();

    while ( i <= K && A[i] == '&' )
    {
        ++i;
        result &= lev3();
    }

    return result;
}
bool lev3()
{
    bool semn = false, result = false;

    if ( A[i] == '!' ) semn = 1, ++i;

    if ( A[i] == '(' )
        result = lev1() ^ semn;
    else if ( ( A[i] >= 'A' && A[i] <= 'Z' ) || A[i] == 'a' || A[i] == 'b' )
        result = fr[A[i++]] ^ semn;

    return result;
}