Cod sursa(job #756088)

Utilizator gallexdAlex Gabor gallexd Data 8 iunie 2012 23:27:46
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <cstring>

char expr[1010];
char modif[102];
int N;
bool rez;
bool vars[26];
char *p;

char operators[3][4] = {"OR", "AND", ""};
int hmax = 2;

void delSpaces (char *p) {
    for (int i=0; i<strlen(p); ++i)
        if (p[i] == ' ')
            strcpy(p+i, p+i+1);
}

bool operatie( bool t1, bool t2, char *o) {

    if ( !strcmp(o,"AND") ) return t1 && t2;
    else if (!strcmp(o, "OR") ) return t1 || t2;


}

bool eval(int);

bool operand () {
    bool r;
    if ( *p == '(') {
        ++p; r = eval(0); ++p;
    } else if ( !strncmp(p, "NOT", 3)) {
        p+=3; r = !eval(0);
    } else if ( !strncmp(p, "TRUE", 4)) {
        p+=4; r = true;
    } else if ( !strncmp(p, "FALSE", 5)) {
        p+=5; r = false;
    } else {
        r = vars[p[0]-'A'];
        ++p;
    }
    return r;
}

bool eval(int h) {
    bool r = (h == hmax)? operand() : eval(h+1);
    while ( h < hmax && strncmp(operators[h], p, strlen(operators[h]))==0 ) {
        p += strlen(operators[h]);
        r = operatie(r, eval(h+1), operators[h]);
    }
    return r;
}

int main () {

    freopen("evaluare.in","rt",stdin);
    freopen("evaluare.out","wt",stdout);

    gets(expr);
    delSpaces(expr);
    p = expr;

    scanf("%d\n", &N);
    gets(modif);

    for (int i=0; i<N; ++i) {
        int v = modif[i]-'A';
        vars[v] = (vars[v])?false:true;
        printf("%hd", eval(0));
        p = expr;
    }
    printf("\n");
    return 0;
}