Cod sursa(job #1693003)

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

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

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

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] == 'O' && S[pos + 1] == 'R' ) {
        pos += 2;
        answer = ( answer | solve_small_priority( pos ) );
    }

    return answer;
}

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

    while( S[pos] == 'A' && S[pos + 1] == 'N' && S[pos + 2] == 'D' ) {
        pos += 3;
        answer = ( answer & solve_medium_priority( pos ) );
    }

    return answer;
}

bool solve_medium_priority( int &pos ) {
    bool answer;

    if( S[pos] == 'N' && S[pos + 1] == 'O' && S[pos + 2] == 'T' ) {
        pos += 3;
        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] == 'T' && S[pos + 1] == 'R' && S[pos + 2] == 'U' && S[pos + 3] == 'E' ) {
        pos += 4;
        answer = true;
    } else
    if( S[pos] == 'F' && S[pos + 1] == 'A' && S[pos + 2] == 'L' && S[pos + 3] == 'S' && S[pos + 4] == 'E' ) {
        pos += 5;
        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( S + 1, DIM, input_file );
    N = strlen( S + 1 ) - 1;

    for( int i = 1; i <= N; i ++ ) {
        if( S[i] == ' ' ) {
            for( int j = i + 1; j < N; j ++ )
                S[j - 1] = S[j];
            N --; i --;
        }
    }

    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;
}