Cod sursa(job #2453504)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 4 septembrie 2019 10:39:12
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
char S[1002], ch, op[1002], S2[1002];
int i, n, val[36], num[1002], k1, k2, p[202], j, m;
void process(){
    if(k2 == 0)
        return;
    if(op[k2] == '&'){
        num[k1 - 1] = num[k1 - 1] & num[k1];
        k1--;
    }
    else if(op[k2] == '!')
        num[k1] = ! num[k1];
    else if(op[k2] == '|'){
        num[k1 - 1] = num[k1 - 1] | num[k1];
        k1--;
    }
    k2--;
}
void eval(int pos){
    for(int i = pos; S2[i] != 0; i++){
        if(S2[i] == '0' || S2[i] == '1')
            num[++k1] = S2[i] - '0';
        else if(S2[i] == '(')
            op[++k2] = '(';
        else if(S2[i] == ')'){
            while(op[k2] != '(')
                process();
            k2--;
        }
        else if(S2[i] != ' '){
            while(p[op[k2]] > p[S2[i]])
                process();
            op[++k2] = S2[i];
        }
    }
}
int main()
{   f.getline(S + 1, 1002);
    for(i = 1; S[i] != 0; i++){
        if(S[i] == 'A' && S[i + 1] == 'N' && S[i + 2] == 'D'){
            S[i] = '&';
            strcpy(S + i + 1, S + i + 3);
        }
        else if(S[i] == 'O' && S[i + 1] == 'R'){
            S[i] = '|';
            strcpy(S + i + 1, S + i + 2);
        }
        else if(S[i] == 'N' && S[i + 1] == 'O' && S[i + 2] == 'T'){
            S[i] = '!';
            strcpy(S + i + 1, S + i + 3);
        }
        else if(S[i] == 'T' && S[i + 1] == 'R' && S[i + 2] == 'U' && S[i + 3] == 'E'){
            S[i] = '1';
            strcpy(S + i + 1, S + i + 4);
        }
        else if(S[i] == 'F' && S[i + 1] == 'A' && S[i + 2] == 'L' && S[i + 3] == 'S' && S[i + 4] == 'E'){
            S[i] = '0';
            strcpy(S + i + 1, S + i + 3);
        }
    }
    f >> n;
    p['&'] = 2;
    p['|'] = 1;
    for(i = 1; i <= n; i++){
        f >> ch;
        val[ch - 'A' + 1] = 1 - val[ch - 'A' + 1];
        m = 0;
        for(j = 1; S[j] != 0; j++){
            if(S[j] >= 'A' && S[j] <= 'Z')
                if(val[S[j] - 'A' + 1] == 0)
                    S2[++m] = '0';
                else
                    S2[++m] = '1';
            else if(S[j] == '!' && (S[j + 2] >= 'A' && S[j + 2] <= 'Z')){
                if(1 - val[S[j] - 'A' + 1] == 0)
                    S2[++m] = '0';
                else
                    S2[++m] = '1';
                j = j + 2;
            }
            else
                S2[++m] = S[j];
        }
        eval(1);
        while(k2 != 0)
            process();
        g << num[k1];
        memset(num, 0, sizeof(num));
        memset(op, 0, sizeof(0));
    }
    return 0;
}