Cod sursa(job #2154469)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 6 martie 2018 23:05:42
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
#define SIGMA 26
#define MAXLEN 1000

bool EXPR();
bool OR();
bool AND();

int last, len;
char v[1 + MAXLEN], w[1 + MAXLEN];
bool val[1 + SIGMA];

int pos;
bool EXPR(){
    bool ans;
    if(w[pos] == '('){
        pos++;
        ans = OR();
        pos++;
    }
    else if(w[pos] == 1 || w[pos] == 0){
        ans = w[pos];
        pos++;
    }
    else if(w[pos] == '~'){
        pos++;
        ans = 1 - EXPR();
    }
    else{
        ans = val[w[pos] - 'A'];
        pos++;
    }
    return ans;
}
bool AND(){
    bool ans = EXPR();
    while(pos <= last && w[pos] == '&'){
        pos++;
        ans &= EXPR();
    }
    return ans;
}
bool OR(){
    bool ans = AND();
    while(pos <= last && w[pos] == '|'){
        pos++;
        ans |= AND();
    }
    return ans;
}

int main(){
    FILE*fi,*fo;
    fi = fopen("bool.in","r");
    fo = fopen("bool.out","w");

    char c = fgetc(fi);
    while(c != '\n'){
        v[++len] = c;
        c = fgetc(fi);
    }
    for(int i = 1; i <= len; i++){
        if(v[i] == ' ') continue;
        else if(v[i] == '(' || v[i] == ')') w[++last] = v[i];
        else if(v[i + 1] < 'A' || 'Z' < v[i + 1]) w[++last] = v[i];
        else if(v[i] == 'T' && v[i + 1] == 'R' && v[i + 2] == 'U' && v[i + 3] == 'E') w[++last] = 1, i = i + 3;
        else if(v[i] == 'F' && v[i + 1] == 'A' && v[i + 2] == 'L' && v[i + 3] == 'S' && v[i + 4] == 'E') w[++last] = 0, i = i + 4;
        else if(v[i] == 'N' && v[i + 1] == 'O' && v[i + 2] == 'T') w[++last] = '~', i = i + 2;
        else if(v[i] == 'A' && v[i + 1] == 'N' && v[i + 2] == 'D') w[++last] = '&', i = i + 2;
        else w[++last] = '|', i = i + 1;
    }

    int n;
    fscanf(fi,"%d", &n);
    c = fgetc(fi);
    while(c < 'A' || c > 'Z') c = fgetc(fi);
    for(int i = 1; i <= n; i++){
        val[c - 'A'] ^= 1;
        pos = 1;
        fprintf(fo,"%d", OR());
        c = fgetc(fi);
    }

    return 0;
}