Cod sursa(job #1570714)

Utilizator din99danyMatei Daniel din99dany Data 16 ianuarie 2016 19:30:36
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <cstring>
using namespace std;

char q[2000];

int v[1000];
int indi;



bool f1( );
bool f2( );
bool f3( );
bool f4( );

int main()
{

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

    int n, i, j, s, t, d, k;
    char lit;

    fgets(q,1500,stdin);
    if( q[strlen(q)] == '\n' ) q[strlen(q)-1] = '\0';



    for( i = 0; i < strlen(q); ++i ){
        if( q[i] == ' ' ){
            strcpy(q+i,q+i+1);
        }
    }

    //printf("%s\n",q);

    scanf("%d%\n",&n);
    for( i = 1; i <= n; ++i ){
        scanf("%c",&lit);
        indi = 0;
        v[lit] = !v[lit];
        if( f1() ) printf("1");
        else printf("0");
    }



    return 0;
}

bool f1(){

    bool r2, r = f2();

    while( strncmp(q+indi,"OR",strlen("OR")) == 0 ){
        indi += strlen("OR");
        r2 = f2();
        r = (r||r2);
    }

    return r;

}


bool f2(){

    bool r2, r = f3();

    while( strncmp(q+indi,"AND",strlen("AND")) == 0 ){
        indi += strlen("AND");
        r2 = f3();
        r = (r&&r2);
    }

    return r;


}

bool f3(){

    bool r;

    while( strncmp(q+indi,"NOT",strlen("NOT")) == 0 ){
        indi += strlen("NOT");
        r = f3();
        return !r;
    }

    if( q[indi] == '(' ){
        indi++;
        r = f1();
        indi++;
    }
    else if( strncmp(q+indi,"TRUE",strlen("TRUE")) == 0 ){
        r = 1;
        indi += strlen("TRUE");
    }
    if( strncmp(q+indi,"FALSE",strlen("FALSE")) == 0 ){
        r = 1;
        indi += strlen("FALSE");
    }
    else{
        r = v[q[indi]];
        indi++;
    }


    return r;

}