Cod sursa(job #2482848)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 octombrie 2019 22:05:57
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.41 kb
#include <fstream>
#include <deque>
#include <string>

using namespace std;

ifstream fin( "bool.in" );
ofstream fout( "bool.out" );

string s, s2;
int N;
bool val[30];

void Read()
{
    getline( fin, s );
    fin >> N;
    fin >> s2;
}

int Operate( int A, int B, char OP )
{
    if( OP == '!' ) return 1 - B;
    if( OP == '&' ) return ( A == 1 && B == 1 );
    if( OP == '|' ) return ( A == 1 || B == 1 );
}

int Priority( char OP )
{
    if( OP == '!' ) return 3;
    if( OP == '&' ) return 2;
    if( OP == '|' ) return 1;
    if( OP == '(' ) return 0;
}

void ExpEval()
{
    deque <int> var;
    deque <char> op;

    for( int i = 0; i < s.size(); ++i )
    {
        if( s[i] == ' ' ) continue;

        if( s[i] == '(' )
        {
            op.push_back( '(' );
            continue;
        }
        if( i < s.size() - 3 && s[i] == 'T' && s[i + 1] == 'R' && s[i + 2] == 'U' )
        {
            var.push_back( 1 );
            i += 3;
            continue;
        }
        if( i < s.size() - 4 && s[i] == 'F' && s[i + 1] == 'A' && s[i + 2] == 'L' )
        {
            var.push_back( 0 );
            i += 4;
            continue;
        }
        if( s[i] == ')' )
        {
            while( op.back() != '(' )
            {
                int temp_op = op.back();
                int A, B;

                B = var.back();
                var.pop_back();

                if( temp_op != '!' ) {  A = var.back();
                                        var.pop_back();
                                     }

                int ans = Operate( A, B, temp_op );

                var.push_back( ans );
            }
            op.pop_back();

            continue;
        }

        if( 'A' <= s[i] && s[i] <= 'Z' )
        {
            var.push_back( val[s[i] - 'A'] );
            continue;
        }

        char ope;

        if( i < s.size() - 3 && s[i] == 'N' && s[i + 1] == 'O' )
        {
            ope =  '!';
            i += 2;
        }
        if( i < s.size() - 3 && s[i] == 'A' && s[i + 1] == 'N' )
        {
            ope =  '&';
            i += 2;
        }
        if( i < s.size() - 2 && s[i] == 'O' && s[i + 1] == 'R' )
        {
            ope =  '|';
            i += 1;
        }

        while( !op.empty() && Priority( op.back() ) >= Priority( ope ) )
        {
            int temp_op = op.back();
            int A, B;

            B = var.back();
            var.pop_back();

            if( temp_op != '!' ) {  A = var.back();
                                    var.pop_back();
                                 }

            int ans = Operate( A, B, temp_op );

            var.push_back( ans );
        }

        op.push_back( ope );
    }

    while( !op.empty() )
    {
       int temp_op = op.back();
       int A, B;

       B = var.back();
       var.pop_back();

       if( temp_op != '!' ) {  A = var.back();
                                    var.pop_back();
                                 }

       int ans = Operate( A, B, temp_op );

       var.push_back( ans );
    }

    fout << var.front();
}

void Do()
{
    for( int i = 1; i <= N; ++i )
    {
        char c = s2[i - 1];

        val[c - 'A'] = val[c - 'A'] ^ 0 ^ 1;

        ExpEval();
    }
}

int main()
{
    Read();
    Do();

    fin.close();
    fout.close();

    return 0;
}