Cod sursa(job #3367869)

Utilizator MateiDiaconuDiaconu Matei Stefan MateiDiaconu Data 11 octombrie 2026 16:36:09
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAXS 1000
#define NRLIT 26

char s[MAXS];
int sIndex;
int ssize;

bool values[NRLIT];

bool evaluate();

void simplify(){
    int i, ssize;

    ssize = strlen(s);
    i = sIndex = 0;
    while(i < ssize){
        if(s[i] >= 'A' && s[i] <= 'Z'){
            if(s[i] == 'A' && i + 1 < ssize && s[i + 1] == 'N'){
                s[sIndex] = '&';
                i += 3;
            }
            else if(s[i] == 'O' && i + 1 < ssize && s[i + 1] == 'R'){
                s[sIndex] = '|';
                i += 2;
            }
            else if(s[i] == 'N' && i + 1 < ssize && s[i + 1] == 'O'){
                s[sIndex] = '!';
                i += 3;
            }
            else if(s[i] == 'F' && i + 1 < ssize && s[i + 1] == 'A'){
                s[sIndex] = '0';
                i += 5;
            }
            else if(s[i] == 'T' && i + 1 < ssize && s[i + 1] == 'R'){
                s[sIndex] = '1';
                i += 4;
            }
            else{
                s[sIndex] = s[i];
                i++;
            }
            sIndex++;
        }
        else if(s[i] == '(' || s[i] == ')'){
            s[sIndex] = s[i];
            sIndex++;
            i++;
        }
        else{
            i++;
        }
    }

    for(i = sIndex; i < ssize; i++){
        s[i] = '\0';
    }
}

bool factor(){
    bool rez;

    if(s[sIndex] == '('){
        sIndex++;
        rez = evaluate();
        sIndex++;
    }
    else if(s[sIndex] == '!'){
        sIndex++;
        rez = !factor();
    }
    else{
        rez = false;
        if(s[sIndex] >= 'A' && s[sIndex] <= 'Z'){
            rez = values[s[sIndex] - 'A'];
            sIndex++;
        }
    }

    return rez;
}

bool and_op(){
    bool rez;

    rez = factor();
    while(s[sIndex] == '&'){
        sIndex++;
        rez &= factor();
    }

    return rez;
}

bool evaluate(){
    bool rez;

    rez  = and_op();
    while(s[sIndex] == '|'){
        sIndex++;
        rez |= and_op();
    }

    return rez;
}

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

    int n, i;
    char ch;

    fgets(s, MAXS, fin);

    simplify();     // AND = &, OR = |, NOT = !, FALSE = 0, TRUE = 1
                    // Removes all spaces

    fscanf(fin, "%d ", &n);

    for(i = 0; i < NRLIT; i++){
        values[i] = false;
    }

    for(i = 0; i < n; i++){
        ch = fgetc(fin);
        values[ch - 'A'] = !values[ch - 'A'];
        sIndex = 0;
        fprintf(fout, "%d", evaluate());
    }

    fclose(fin);
    fclose(fout);
    return 0;
}