Cod sursa(job #2832875)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 14 ianuarie 2022 14:25:48
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.37 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;
    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");

    int n;

    fin.getline(s, N);
    fin >> n;

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

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

    return 0;

    /*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;*/
}