Cod sursa(job #2832802)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 14 ianuarie 2022 12:27:53
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

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

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();
        p++;
        if(semn)
            return rez;
        return !rez;
    }

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

    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'];
        fout << expresie();
    }

    return 0;
}