Cod sursa(job #1473599)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 19 august 2015 18:45:03
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.99 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

const int NMax = 1005;
const int LMax = 30;

const string AND ("AND");
const string OR ("OR");
const string NOT ("NOT");
const string TRUE ("TRUE");
const string FALSE ("FALSE");

int k, pz;
char v[NMax];
char *p;

vector < int > l[LMax];

bool termen();

bool eval(){
    bool r = termen();
    bool R;
    if(*p == '+' || *p == '-'){
        p++;
        R = termen();
        if(*p == '+'){
            if(R && r){
                r = 1;
            } else {
                r = 0;
            }
        }
        if(*p == '-'){
            if(R || r){
                r = 1;
            } else {
                r = 0;
            }
        }
    }
    return r;
}

bool termen(){
    bool r = 0;
    if(*p == '('){
        p++;
        r = eval();
        p++;
    } else {
        r = (*p - '0');
        p++;
    }
    return r;
}

void elimin(bool neg){
    if(neg && v[pz] == '0'){
        v[pz] = '1';
        pz++;
        return;
    }
    if(neg && v[pz] == '1'){
        v[pz] = '0';
        pz++;
        return;
    }
    if(v[pz] == '('){
        while(pz < k && v[pz] != ')'){
            pz++;
            if(neg &&v[pz] == '0'){
                v[pz] = '1';
            } else {
                if(neg && v[pz] == '1'){
                    v[pz] = '0';
                } else {
                    if(v[pz] == '('){
                        pz++;
                        elimin(neg);
                    } else {
                        if(v[pz] == '!'){
                            v[pz] = '$';
                            pz++;
                            elimin(!neg);
                        }
                    }
                }
            }
        }
    }
}

int main(){
    int n, nt = 0;
    bool ok = 1;
    char c;
    string s;
    while(ok && fin >> s){
        fin.get(c);
        if(c == '\n'){
            ok = 0;
        }
        for(int i = 0; i < s.size(); i++){
            if(s.compare(i, 3, AND) == 0){
                v[k++] = '+';
                i += 2;
            } else {
                if(s.compare(i, 3, NOT) == 0){
                    v[k++] = '!';
                    i += 2;
                    nt++;
                } else {
                    if(s.compare(i, 2, OR) == 0){
                        v[k++] ='-';
                        i += 1;
                    } else {
                        if(s[i] == ')' || s[i] == '('){
                            v[k++] = s[i];
                        } else {
                            if(s.compare(i, 4, TRUE) == 0){
                                v[k++] = '1';
                                i += 3;
                            } else {
                                if(s.compare(i, 5, FALSE) == 0){
                                    v[k++] = '0';
                                    i += 4;
                                } else {
                                    l[s[i] - 'A'].push_back(k - nt);
                                    v[k++] = '0';
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    while(pz < k){
        if(v[pz] == '!'){
            v[pz] = '$';
            pz++;
            elimin(1);
        }
        pz++;
    }
    int neg = 0;
    for(int i = 0; i <= k - neg; i++){
        while(v[i + neg] == '$'){
            neg++;
        }
        v[i] = v[i + neg];
    }
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> c;
        k = c - 'A';
        for(int j = 0; j < l[k].size(); j++){
            if(v[l[k][j]] == '1'){
                v[l[k][j]] = '0';
            } else {
                v[l[k][j]] = '1';
            }
        }
        p = v;
        fout << eval();
    }
    return 0;
}