Cod sursa(job #907978)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 8 martie 2013 16:14:16
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<fstream>
#include<cstring>

char s[2020];
char T[120];

int F[100];

int t, i, j;

using namespace std;

int expresie();
int termenssau();
int termenssi();
int termensnu();

void parsare(char *s) {
    for (i=0;s[i]!=0;i++) {
        if (s[i] == 'T' && s[i+1] == 'R' && s[i+2] == 'U' && s[i+3] == 'E') {
            s[i] = '1';
            strcpy(s+i+1, s+i+4);
        } else
            if (s[i] == 'F' && s[i+1] == 'A' && s[i+2] == 'L' && s[i+3] == 'S' && s[i+4] == 'E') {
                s[i] = '0';
                strcpy(s+i+1, s+i+5);
            } else
                if (s[i] == 'A' && s[i+1] == 'N' && s[i+2] == 'D') {
                    s[i] = '&';
                    strcpy(s+i+1, s+i+3);
                } else
                    if (s[i] == 'O' && s[i+1] == 'R') {
                        s[i] = '|';
                        strcpy(s+i+1, s+i+2);
                    } else
                        if (s[i] == 'N' && s[i+1] == 'O' && s[i+2] == 'T') {
                            s[i] = '1';
                            s[i+1] = '^';
                            strcpy(s+i+2, s+i+3);
                        }
    }
    j = 0;
    for (i=1;s[i]!=0;i++) {
        if (s[i] != ' ')
            s[++j] = s[i];
    }
    s[++j] = 0;
}

int expresie() {
    int r = termenssau();
    while (s[i] == '|') {
        i++;
        r |= termenssau();
    }
    return r;
}

int termenssau() {
    int r = termenssi();
    while (s[i] == '&') {
        i++;
        r &= termenssi();
    }
    return r;
}

int termenssi() {
    int r = termensnu();
    while (s[i] == '^') {
        i++;
        r ^= termensnu();
    }
    return r;
}

int termensnu() {
    int r;
    if (s[i] == '(') {
        i++;
        r = expresie();
        i++;
        return r;
    }
    if (s[i] == '1') {
        i++;
        return 1;
    }
    if (s[i] == '0') {
        i++;
        return 0;
    }
    if (s[i] >='A' && s[i] <= 'Z') {
        i++;
        return F[s[i-1]];
    }
}

int main(){

    ifstream fin("bool.in");
    ofstream fout("bool.out");
    fin.get(s, 2010);
    fin>>t;
    fin>>T;
    parsare(s);
//    fout<<s;
    for (j=0;j<t;j++) {
        F[T[j]] = 1-F[T[j]];
        i = 0;
        fout<<expresie();
    }

    fout<<"\n";
    return 0;
}