Cod sursa(job #884641)

Utilizator caliuxSegarceanu Calin caliux Data 21 februarie 2013 09:41:02
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <stdio.h>
#include <string.h>
using namespace std;

char exp[1005], ch;
int N, i, frec[32], frec2[32], p;

int expresie();
int termen();
int factor();

inline void schimba(){
    int len = strlen(exp);
    for(i = 0; exp[i] != NULL; i++){
        if(exp[i] == ' '){
            strcpy(exp + i, exp + i + 1);
        }
    }
    for(i = 0; exp[i] != NULL; i++){
        if(exp[i] == 'A' && exp[i + 1] == 'N' && exp[i + 2] == 'D'){
            exp[i] = '&'; i++;
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1); i--;
        }else if(exp[i] == 'N' && exp[i + 1] == 'O' && exp[i + 2] == 'T'){
             exp[i] = '-'; i++;
             strcpy(exp + i, exp + i + 1);
             strcpy(exp + i, exp + i + 1);i--;
        }else if(exp[i] == 'O' && exp[i + 1] == 'R' ){
              exp[i] = '|'; i++;
              strcpy(exp + i, exp + i + 1); i--;
        }else if(exp[i] == 'T' && exp[i + 1] == 'R' && exp[i + 2] == 'U'){
            exp[i] = '1'; i++;
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1); i--;
        }else if(exp[i] == 'F' && exp[i + 1] == 'A' && exp[i + 2] == 'L'){
            exp[i] = '0'; i++;
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1);
            strcpy(exp + i, exp + i + 1); i--;
        }
    }
}

int expresie(){
    int rez = termen(); p++;
    while(exp[p] == '&' || exp[p] == '|' || exp[p] == '-'){
        if(exp[p] == '&'){
            p++;
            rez &= termen();
        }else if(exp[p] == '|'){
            p++;
            rez |= termen();
        }else if(exp[p] == '-'){
            p++;
            rez -= termen();
        }
    }
    return rez;
}
int termen(){
    int val;
    if(exp[p] == '('){
       p++;
       val = expresie();
       p++;
       return val;
    }else if(exp[p] == '-'){
        p++;
         if(exp[p] == '('){
            p++;
            val = expresie();
            p++;
            return (!val);
         }else{
             return (!frec[exp[p] - 'A']);
         }
    }
    return frec[exp[p] - 'A'];

}

int main(){

    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    gets(exp); schimba();
    scanf("%d\n", &N);
    for(i = 0; i < N; i++){
        scanf("%c", &ch);
        frec[ch - 'A'] = (!frec[ch - 'A']);
        memset(frec2, 0, sizeof(frec2));
        memcpy(frec2, frec, sizeof(frec));
        p = 0; printf("%d", expresie());
    }
}