Cod sursa(job #1989989)

Utilizator PondorastiAlex Turcanu Pondorasti Data 9 iunie 2017 19:57:05
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
string line, a[3000];
int k = 0, o = 0, n, stackAlpha[3000], stackOp[3000];
int priority[3000];
bool alf[30];
int length;
void Read();
void Solve();
int Calculator(int a, int b, int c);
int main()
{
    ifstream cin("bool.in");
    ofstream cout("bool.out");
    getline(cin,line);
    Read();
    cin>>n;
    for(int i = 1 ; i <= n ; ++i) {
        char ch;
        cin>>ch;
        alf[ch - 'A'] = !alf[ch - 'A'];
        Solve();
        cout<<stackAlpha[k];
    }
    return 0;
}
void Solve() {
    priority['|'] = 1;
    priority['&'] = 2;
    priority['!'] = 3;
    priority['('] = 4;
    int i = 1, x = 0;
    k = 0, o = 0;
    while(i <= length + 1) {
        char ch = a[i][0];
        if('A' <= ch && ch <= 'Z') {
            stackAlpha[++k] = alf[ch - 'A'];
        }
        else if(ch == '>')
            stackAlpha[++k] = 1;
        else if(ch == '<')
            stackAlpha[++k] = 0;
        else if(ch == ')') {
            while(stackOp[o] != '(') {
                    stackAlpha[++k] = stackOp[o--];
                    if(stackAlpha[k] != '!')
                        x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
                    else
                        x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
                    stackAlpha[k] = x;
                  }
            --o;
        }
        else {
            while(o > 0 && k > 0 && stackOp[o] != '(' && priority[stackOp[o]] >= priority[ch]) {
                    stackAlpha[++k] = stackOp[o--];
                    if(stackAlpha[k] != '!')
                        x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
                    else
                        x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
                    stackAlpha[k] = x;
                  }
            stackOp[++o] = ch;
        }
        ++i;
    }
}
int Calculator(int a, int b, int c) {
    switch (c) {
        case '!': return !a;
        case '&': return a & b;
        case '|': return a | b;
    }
}
void Read() {
    stringstream sin(line);
    char ch;
    string word = "";
    while(sin>>ch) {
        if(word == "N" && ch == 'O')
            a[++length] = '!' ,word = "" ,sin>>ch ,sin>>ch;
        else if(word == "A" && ch == 'N')
            a[++length] = '&' ,word = "" ,sin>>ch ,sin>>ch;
        else if(word == "O" && ch == 'R')
            a[++length] = '|' ,word = "" ,sin>>ch;
        else if(word == "T" && ch == 'R')
            a[++length] = '>', word ="" ,sin>>ch ,sin>>ch ,sin>>ch;
        else if(word == "F" && ch == 'A')
            a[++length] = '<', word ="" ,sin>>ch ,sin>>ch ,sin>>ch ,sin>>ch;
        else if(word != "")
            a[++length] = word ,word = "";
        word += ch;
    }
    a[++length] = word;
}