Cod sursa(job #2832959)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 14 ianuarie 2022 15:30:14
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

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

bool vars[30];
int nvars;

int p;
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 = 1;
    bool rez;
    while(s[p] == '!'){
        p++;
        semn = !semn;
    }

    if(s[p] == '('){
        p++;
        rez = expresie();
    }
    else if(s[p] == '0')
        rez = false;
    else if(s[p] == '1')
        rez = true;
    else
        rez = vars[s[p] - 'A'];

    p++;

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

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

    fin.get(cs, N);

    modif();

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

    return 0;
}