Cod sursa(job #2791712)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 30 octombrie 2021 23:27:43
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

char s[1015];
map <char, bool> mp;

bool OR(int &p), AND(int &p), NXT(int &p);

void clean(int &p){
    while(s[p] == ' ')
        p++;
}

///next string
bool NXT(int &p){
    clean(p);
    bool answer=0;

    if(s[p] == '('){
        p++; ///scap de (
        answer = OR(p);
        p++; ///scap de )
    }else if(s[p] == 'N' && s[p+1] == 'O' && s[p+2] == 'T'){
        p += 3;
        answer = !NXT(p);
    }else if(s[p] == 'T' && s[p+1] == 'R' && s[p+2] == 'U' && s[p+3] == 'E'){
        p += 4;
        answer = 1;
    }else if(s[p] == 'F' && s[p+1] == 'A' && s[p+2] == 'L' && s[p+3] == 'S' && s[p+4] == 'E'){
        p += 5;
        answer = 0;
    }else{
        answer = mp[ s[p] ];
        p++;
    }

    clean(p);
    return answer;
}

bool AND(int &p){
    clean(p);
    bool answer=NXT(p);

    while(s[p] == 'A' && s[p+1] == 'N' && s[p+2] == 'D'){
        p += 3;
        answer &= NXT(p);
    }

    clean(p);
    return answer;
}

bool OR(int &p){
    clean(p);
    bool answer = AND(p);

    while(s[p] == 'O' && s[p+1] == 'R'){
        p+=2;
        answer |= NXT(p);
    }

    clean(p);
    return answer;
}

int main (){
    for(char c='A'; c <= 'Z'; c++)
        mp[(char)c]=false;

    fin.get(s, 1005);

    char c; int q; fin>>q;
    while(q--){
        fin>>c;
        mp[c] = 1-mp[c];

        int p=0;
        fout<<OR(p);
    }
    return 0;
}