Cod sursa(job #296396)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 4 aprilie 2009 18:42:47
Problema Bool Scor 100
Compilator cpp Status done
Runda Star Trek Marime 1.71 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <bitset>

using namespace std;

bitset<26> stare;
char s[1024],valori[1024], tmp[1024];
int N, poz;

bool eval();
bool termen();
bool factor();

bool eval(){
    bool rez = termen();

    while (s[poz] == 'O' && s[poz + 1] == 'R'){
        poz += 3;
        rez = rez | termen();
    }

    return rez;
}

bool termen(){
    bool rez = factor();

    while (s[poz] == 'A' && s[poz + 1] == 'N' && s[poz + 2] == 'D'){
        poz += 4;
        rez = rez & factor();
    }

    return rez;
}

bool factor() {
    bool rez;

    if (s[poz] == '(') {
        ++poz;
        rez = eval();
        ++poz;
    } else
    if (s[poz] == 'N' && s[poz + 1] == 'O' && s[poz + 2] == 'T') {
        poz += 4;
        rez = ! factor();
    } else
    if (s[poz] == 'T' && s[poz + 1] == 'R' && s[poz + 2] == 'U' && s[poz + 3] == 'E') {
        poz += 5;
        rez = 1;
    } else
    if (s[poz] == 'F' && s[poz + 1] == 'A' && s[poz + 2] == 'L' && s[poz + 3] == 'S' && s[poz + 4] == 'E') {
        poz += 6;
        rez = 0;
    } else{
        rez = stare[s[poz] - 'A'];
        poz += 2;
    }
    return rez;
}
int main(){
    int i, aux, len, n, m;
    char str[1012];

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

    gets(s);

    i = -1; n = strlen(s); m = -1;
	while (i < n) {
		i++;
		str[++m] = s[i];
		while (s[i] == s[i + 1] && s[i + 1] == ' ' && i < n) i++;
	}
	str[++m] = 0;

	strcpy(s, str);
//puts(s);
    scanf("%d\n", &N);

    gets(valori);

    for (i = 0; i < N; ++i){
        poz = 0;
        stare[valori[i] - 'A'] = 1 - stare[valori[i] - 'A'] ; //printf("%c %d", valori[i], (int)stare[valori[i] - 'A']);
        printf("%d", (int) eval());
    }

}