Cod sursa(job #1505446)

Utilizator DobosDobos Paul Dobos Data 19 octombrie 2015 10:39:44
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("bool.in");
ofstream fout("bool.out");
string s;
bitset < 150 > val;
stack < char > operatie;
stack < bool > valuare;
inline int rangseg(char x){
    if(x == '&')
        return 1;
    if(x == '|')
        return 1;
    if(x == '!')
        return 2;
    return 0;
}
inline void calcul()
{
   char x = operatie.top(); operatie.pop();
   if(x == '!' ) {
  //  fout << valuare.top() << " ";
  valuare.top() = !valuare.top();
  }
    else{
        bool a = valuare.top(); valuare.pop();
        bool b = valuare.top(); valuare.pop();
   if(x == '&')
        valuare.push(a & b);
   if(x == '|')
        valuare.push(a | b);
    }
}

inline int evalexp()
{
    for(int i = 0 ; i < s.size(); i ++){
        if(s[i] == '('){
            operatie.push('(');
           } else {
           if(s[i] == ')'){
            while(operatie.top() != '(')
                    calcul();
            operatie.pop();
           } else {
           int r = rangseg(s[i]);
           if(r!= 0){
               while(rangseg(operatie.top()) >= r && rangseg(operatie.top()) != 2)
               calcul();
               operatie.push(s[i]);
           } else {
           if((s[i] >= 'A' && s[i] <= 'Z') || (s[i] == 't' || s[i] == 'f')){
            valuare.push(val[s[i]]);
            while(rangseg(operatie.top()) == 2 )
               calcul();
           }
           }
           }
           }
    }
    while(operatie.size() > 1)
        calcul();
    return valuare.top();
}
int main()
{
    int n;
    char x;
    operatie.push('#');
    getline(fin ,s);
    for(int i = 0; i < s.size(); i++){
        if(s[i] == 'A' && s[i+1] == 'N')
            s[i] = '&',s.erase(s.begin() + i + 1,s.begin() + i + 3);
        if(s[i] == 'N' && s[i+1] == 'O')
            s[i] = '!',s.erase(s.begin() + i + 1,s.begin() + i + 3);
        if(s[i] == 'O' && s[i+1] == 'R')
            s[i] ='|',s.erase(s.begin() + i + 1);
        if(s[i] == 'T' && s[i+1] == 'R')
            s[i] = 't',s.erase(s.begin() + i + 1,s.begin() + i + 4);
        if(s[i] == 'F' && s[i+1] == 'A')
            s[i] = 'f',s.erase(s.begin() + i + 1,s.begin() + i + 5);
    }
    val['t'] = 1;
   fin >> n ;
    for(int i = 1; i <= n; i++){
        fin >> x;
        val[x] = !val[x];
        while(!valuare.empty())
            valuare.pop();
        fout << evalexp();
    }

    return 0;
}