Cod sursa(job #3326337)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 28 noiembrie 2025 10:19:15
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

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

int v[333];

int Expresie(string &S,int &p);
int Termen_OR(string &S,int &p);
int Termen_AND(string &S,int &p);

int Expresie(string &S,int &p){
    int ans = Termen_OR(S,p);
    while (p<S.size() and S[p]=='|'){
        p++;
        ans = ans|Termen_OR(S,p);
    }
    return ans;
}

int Termen_OR(string &S,int &p){
    int ans = Termen_AND(S,p);
    while (p<S.size() and S[p]=='&'){
        p++;
        int loc = Termen_AND(S,p);
        ans = ans&loc;
    }
    return ans;
}

int Termen_AND(string &S,int &p){
    bool hasNOT = 0;
    if (S[p]=='~'){
        hasNOT = 1;
        p++;
    }
    int val = 0;
    //cout << p << '\n';
    if (S[p]=='('){
        p++;
        val = Expresie(S,p);
        p++;
    }else{
        if (S[p]=='0') val = 0;
        else if (S[p]=='1') val = 1;
        else val = v[S[p]];
        p++;
    }
    if (hasNOT==1) val = 1-val;
    return val;
}

signed main()
{
    string init;
    getline(fin,init);
    string S;
    int I = 0;
    while (I<init.size()){
        if (init[I]=='(' or init[I]==')'){
            S = S+init[I];
            I++;
        }else if (init[I]>='A' and init[I]<='Z'){
            if (init[I]=='T' and I+3<init.size() and init[I+1]=='R' and init[I+2]=='U' and init[I+3]=='E'){
                S = S+"1";
                I = I+4;
            }else if (init[I]=='F' and I+4<init.size() and init[I+1]=='A' and init[I+2]=='L' and init[I+3]=='S' and init[I+4]=='E'){
                S = S+"0";
                I = I+5;
            }else if (init[I]=='A' and I+2<init.size() and init[I+1]=='N' and init[I+2]=='D'){
                S = S+"&";
                I = I+3;
            }else if (init[I]=='O' and I+1<init.size() and init[I+1]=='R'){
                S = S+"|";
                I = I+2;
            }else if (init[I]=='N' and I+2<init.size() and init[I+1]=='O' and init[I+2]=='T'){
                S = S+"~";
                I = I+3;
            }else{
                S = S+init[I];
                I++;
            }
        }else{
            I++;
        }
    }
    int q;
    fin >> q;
    while (q--){
        char x;
        fin >> x;
        v[x] = 1-v[x];
        int p = 0;
        fout << Expresie(S,p);
    }
    return 0;
}