Cod sursa(job #2950304)

Utilizator andreea_chivuAndreea Chivu andreea_chivu Data 3 decembrie 2022 14:36:39
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int N = 1e4 + 1;
char cs[N];
char s[N];

void modif(){
    int pl = 0;
    int cnt = 0;
    int len = strlen(cs);
    while(pl < len){
        if(cs[pl] == ' ')
            pl++;
        else if(cs[pl] == 'A' && pl + 2 < len && cs[pl + 1] == 'N' && cs[pl + 2] == 'D'){
            s[cnt++] = '&';
            pl += 3;
        }else if(cs[pl] == 'O' && pl + 1 < len && cs[pl + 1] == 'R'){
            s[cnt++] = '|';
            pl += 2;
        }else if(cs[pl] == 'N' && pl + 2 < len && cs[pl + 1] == 'O' && cs[pl + 2] == 'T'){
            s[cnt++] = '!';
            pl += 3;
        }else if(cs[pl] == 'T' && pl + 3 < len && cs[pl + 1] == 'R' && cs[pl + 2] == 'U' && cs[pl + 3] == 'E'){
            s[cnt++] = '1';
            pl += 4;
        }else if(cs[pl] == 'F' && pl + 4 < len && cs[pl + 1] == 'A' && cs[pl + 2] == 'L' && cs[pl + 3] == 'S' && cs[pl + 4] == 'E'){
            s[cnt++] = '0';
            pl += 5;
        }else{
            s[cnt++] = cs[pl];
            pl++;
        }
    }
}

bool vars[30];

int p = 0;
bool expresie();
bool termen();
bool factor();

bool expresie(){
    bool rez = termen();
    while(s[p] == '|'){
        p++;
        rez = rez || termen();
    }
    return rez;
}

bool termen(){
    bool rez = factor();
    while(s[p] == '&'){
        p++;
        rez = rez && factor();
    }
    return rez;
}

bool factor(){
    bool semn = true;
    bool rez = false;
    while(s[p] == '!'){
        p++;
        semn = !semn;
    }
    if(s[p] == '('){
        p++;
        rez = expresie();
        p++;
        if(semn)
            return rez;
        return !rez;
    }

    if(s[p] == '0')
        rez = false;
    else if(s[p] == '1')
        rez = true;
    else if(s[p] >= 'A' && s[p] <= 'Z')
        rez = vars[s[p] - 'A'];

    p++;

    if(semn)
        return rez;
    return !rez;
}

int main()
{
    ifstream fin("bool.in");
    ofstream fout("bool.out");

    fin.getline(cs, N);

    modif();

    int n;
    fin >> n;
    for(int i = 0; i < n; i++){
        p = 0;
        char c;
        fin >> c;
        vars[c - 'A'] = !vars[c - 'A'];
        fout << expresie();
    }

    return 0;
}