Cod sursa(job #1832610)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 20 decembrie 2016 16:00:37
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
stack <int>S;
int i,k,j,x2,semn;
string str[1001];
bool islit(char x);
void rez()
{
     if(str[j] != ")" || str[j+1] !="OR")
     {
         x2=S.top();
         S.pop();
         while(!S.empty() && S.top()<0 && S.top()!=-4)
         {
             semn=S.top();
             S.pop();
             if(semn==-3)S.push(1-x2);
             else if(semn==-1)S.top()=(S.top()&x2);
             else S.top()=(S.top()|x2);
             x2=S.top();
             S.pop();
         }
         S.push(x2);
     }
     else
     {
         if(str[j]==")"){
         x2=S.top();
         S.pop();
         S.pop();
         S.push(x2);
         str[j]="$";
         rez();
         str[j]=")";
         }
     }
}
bool islit(char x)
{
    return x<=90 && x>=65;
}
bool lit[90+3];
int n;
int main()
{
    string s,x="";
    getline(fin,s);
    for(i=0;i<s.size();i++)
    {
        if(isalpha(s[i]))x.push_back(s[i]);
        else
        {
            if(x!="")str[++k]=x;
            x="";
            if(s[i]=='(' || s[i]==')')x.push_back(s[i]);
            if(x!="")str[++k]=x;
            x="";
        }
    }
    if(x!="")str[++k]=x;
    fin>>n;
    for(int r=1;r<=n;++r)
    {
        char l;
        fin>>l;
        lit[l]=1-lit[l];
        for(j=1;j<=k;j++)
        {
            if(str[j]=="FALSE")
            {
                S.push(0);
                rez();
            }
            else if(str[j]=="TRUE")
            {
                S.push(1);
                rez();
            }
            else if(str[j].size()==1 && isalpha(str[j][0]))
            {
                S.push(lit[str[j][0]]);
                rez();
            }
            else if(str[j]==")")rez();
            else if(str[j]=="AND")S.push(-1);
            else if(str[j]=="OR")S.push(-2);
            else if(str[j]=="NOT")S.push(-3);
            else if(str[j]=="(")S.push(-4);
        }
        fout<<S.top();
        S.pop();
    }
    return 0;
}