Cod sursa(job #1570677)

Utilizator din99danyMatei Daniel din99dany Data 16 ianuarie 2016 18:57:44
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <cstdio>
#include <cstring>
using namespace std;

char q[2000];

int v[1000];
int indi;

void sparg( char s[], char c ){

    char *p;
    int t = strlen(s);

    p = strstr(q,s);

    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = c;
        p = strstr(q,s);
    }

}

int f1( );
int f2( );
int f3( );
int f4( );

int main()
{

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

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

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


    p = strstr(q,"OR");
    t= 2;
    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = '|';
        p = strstr(q,"OR");
    }

    p = strstr(q,"AND");
    t= 3;
    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = '&';
        p = strstr(q,"AND");
    }

    p = strstr(q,"TRUE");
    t = 4;
    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = '1';
        p = strstr(q,"TRUE");
    }

    p = strstr(q,"NOT");
    t = 3;
    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = '!';
        p = strstr(q,"NOT");
    }

    p = strstr(q,"FALSE");
    t = 5;
    while( p != NULL ){
        strcpy(p+1,p+t);
        *p = '0';
        p = strstr(q,"FALSE");
    }




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

            strcpy(q+i,q+i+1);
        }
    }

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



    return 0;
}

int f1(){

    int r2, r = f2();

    while( q[indi] == '|'){
        indi++;
        r2 = f2();
        r = (r||r2);
    }

    return r;

}


int f2(){

    int r2, r = f3();

    while( q[indi] == '&' ){
        indi++;
        r2 = f3();
        r = (r&&r2);
    }

    return r;


}


int f3(){

    int se = 1;

    while( q[indi] == '!' ){
        se = -se;
        indi++;
    }

    int r = f4();

    if( se == -1 ){
        r = !r;
        return r;
    }
    else return r;



}

int f4(){

    int r = 0;

    if( q[indi] == '(' ){
        indi++;
        r = f1();
    }
    else if( q[indi] >= '0' && q[indi] <= '9' ) r = q[indi] - '0';
    else if ( q[indi] >= 'A' && q[indi] <= 'Z' ) r = v[q[indi]-'A'];

    indi++;
    return r;

}