Cod sursa(job #1339351)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 10 februarie 2015 20:43:52
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.66 kb
#include<fstream>
#include<stack>
#include<iostream>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int NMAX = 1000;

char s[NMAX + 5];
int n,val[50],q;
stack<char> op;
stack<int> opd;

int lungime(char c[])
{

    int i = 1;
    while(c[i] != '\0')
        ++i;
    return i-1;
}

int prioritate(char c)
{

    switch(c){
        case '(':return 0;
            break;
        case ')':return 0;
            break;
        case 'O':return 1;
            break;
        case 'A':return 2;
            break;
        case 'N':return 3;
    }
    return 0;
}

bool e_litera(char c)
{

    if(c >= 'A' && c <= 'Z')
        return true;
    return false;
}

int eval(int a,int b,char o)
{

    switch(o){
        case 'N':return !a;
            break;
        case 'A':return (a && b);
            break;
        case 'O':return (a || b);
            break;
    }
    return 0;
}

void init()
{

    while(!op.empty())
        op.pop();
    while(!opd.empty())
        opd.pop();
    op.push('(');
}

int solve()
{

    int p = 1;
    while(p <= n){
        if(s[p] == ' ')
            ++p;
        if(s[p] == '('){
            op.push(s[p]);
            ++p;
        }
        else if(s[p] == 'N' && s[p+1] == 'O'){
            op.push('N');
            p += 3;
        }
        else if(s[p] == 'A' && s[p+1] == 'N'){
            while(prioritate('A') < prioritate(op.top())){
                if(op.top() == 'N'){
                    int key = opd.top();
                    opd.pop();
                    opd.push(eval(key,0,op.top()));
                }
                op.pop();
            }
            op.push('A');
            p += 3;
        }
        else if(s[p] == 'O' && s[p+1] == 'R'){
            while(prioritate('O') < prioritate(op.top())){
                if(op.top() == 'N'){
                    int key = opd.top();
                    opd.pop();
                    opd.push(eval(key,0,op.top()));
                }
                else if(op.top() == 'A'){
                    int key1 = opd.top();
                    opd.pop();
                    int key2 = opd.top();
                    opd.top();
                    opd.push(eval(key1,key2,'A'));
                }
                op.pop();
            }
            op.push('O');
            p += 2;
        }
        else if(e_litera(s[p]) && !e_litera(s[p+1])){
            opd.push(val[s[p]-'A']);
            ++p;
        }
        else if(s[p] == ')'){
            if(opd.size() == 1)
                break;
            while(op.top() != '('){

                if(op.top() == 'N'){
                    int key = opd.top();
                    opd.pop();
                    opd.push(eval(key,0,'N'));
                }
                else{
                    int key1 = opd.top();
                    opd.pop();
                    int key2 = opd.top();
                    opd.pop();
                    opd.push(eval(key1,key2,op.top()));
                }
                op.pop();
            }
            op.pop();
            ++p;
        }
        else if(s[p] == 'T' && s[p+1] == 'R'){
            opd.push(1);
            p += 4;
        }
        else if(s[p] == 'F' && s[p+1] == 'A'){
            opd.push(0);
            p += 5;
        }
    }
    return opd.top();
}

int main()
{

    in.getline(s + 1,NMAX);
    n = lungime(s);
    s[n + 1] = ')';
    ++n;
    in>>q;
    char what;
    for(int i = 1 ; i <= q ; i++){
        in>>what;
        val[what-'A'] = 1 - val[what - 'A'];
        init();
        out<<solve();
    }
    return 0;
}