Cod sursa(job #1693008)

Utilizator HipixelHi Pixel Hipixel Data 22 aprilie 2016 03:54:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <bits/stdc++.h>

const int DIM = 1 << 11;
const int SIGMA = 27;
using namespace std;

char S[DIM], Aux[DIM], A[DIM]; bool V[SIGMA]; int N, T, pos, M;

bool solve_expression( int &i );
bool solve_small_priority( int &i );
bool solve_medium_priority( int &i );
bool solve_high_priority( int &i );
bool solve_value( int &i );

bool solve_expression( int &pos ) {
    bool answer = solve_small_priority( pos );

    while( S[pos] == '|' ) {
        pos ++;
        answer = ( answer | solve_small_priority( pos ) );
    }

    return answer;
}

bool solve_small_priority( int &pos ) {
    bool answer = solve_medium_priority( pos );

    while( S[pos] == '&' ) {
        pos ++;
        answer = ( answer & solve_medium_priority( pos ) );
    }

    return answer;
}

bool solve_medium_priority( int &pos ) {
    bool answer;

    if( S[pos] == '!' ) {
        pos ++;
        answer = ( !solve_high_priority( pos ) );
    } else
        answer = solve_high_priority( pos );

    return answer;
}

bool solve_high_priority( int &pos ) {
    bool answer;

    if( S[pos] == '(' ) {
        pos ++;
        answer = solve_expression( pos );
        pos ++;
    } else
        answer = solve_value( pos );

    return answer;
}

bool solve_value( int &pos ) {
    bool answer;

    if( S[pos] == '1' ) {
        pos ++;
        answer = true;
    } else
    if( S[pos] == '0' ) {
        pos ++;
        answer = false;
    } else {
        answer = V[ S[pos] - 'A' ];
        pos ++;
    }

    return answer;
}

int main() {

    FILE *input_file  = fopen( "bool.in" , "r" );
    FILE *output_file = fopen( "bool.out", "w" );

    fgets( Aux + 1, DIM, input_file );
    M = strlen( Aux + 1 ) - 1;

    for( int i = 1; i <= M; i ++ ) {
        if( Aux[i] >= 'A' && Aux[i] <= 'Z' && ( i == 1 || Aux[i - 1] == ' ' || Aux[i - 1] == '(' ) && ( i == M || Aux[i + 1] == ' ' || Aux[i + 1] == ')' ) ) {
            S[++N] = Aux[i];
            continue;
        }

        if( Aux[i] == '(' || Aux[i] == ')' ) {
            S[++N] = Aux[i];
            continue;
        }

        if( Aux[i] == 'F' && Aux[i + 1] == 'A' && Aux[i + 2] == 'L' && Aux[i + 3] == 'S' && Aux[i + 4] == 'E' ) {
            S[++N] = '0';
            continue;
        }

        if( Aux[i] == 'T' && Aux[i + 1] == 'R' && Aux[i + 2] == 'U' && Aux[i + 3] == 'E' ) {
            S[++N] = '1';
            continue;
        }

        if( Aux[i] == 'N' && Aux[i + 1] == 'O' && Aux[i + 2] == 'T' ) {
            if( S[N] == '!' )
                N --;
            else
                S[++N] = '!';
            continue;
        }

        if( Aux[i] == 'A' && Aux[i + 1] == 'N' && Aux[i + 2] == 'D' ) {
            S[++N] = '&';
            continue;
        }

        if( Aux[i] == 'O' && Aux[i + 1] == 'R' ) {
            S[++N] = '|';
            continue;
        }
    }

    fscanf( input_file, "%d %s", &T, A + 1 );

    for( int t = 1; t <= T; t ++ ) {
        V[ A[t] - 'A' ] = !V[ A[t] - 'A' ]; pos = 1;

        if( solve_expression( pos ) )
            fprintf( output_file, "1" );
        else
            fprintf( output_file, "0" );
    }

    return 0;
}