Cod sursa(job #2699413)

Utilizator marcumihaiMarcu Mihai marcumihai Data 24 ianuarie 2021 13:43:32
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");

///or 10  and 100 ( 1000

char s[10005];
int nr[30];
stack <int> op;
stack <int> val;
int m,n;
void rezolvare()
{
    if(!op.empty() && op.top()==1000)
    {
        op.pop();
        return;
    }
    while(!op.empty() && op.top()!=1000)
    {
        int a=val.top();
        val.pop();
        int b=val.top();
        val.pop();
        int x=op.top();
        op.pop();
        if(x==10)
        {
            if(a==1 || b==1)
                val.push(1);
            else
                val.push(0);

        }
        if(x==100)
        {
            if(a==1 && b==1)
                val.push(1);
            else
                val.push(0);

        }
    }
    if(!op.empty() && op.top()==1000)
        op.pop();
}
int evaluare()
{
    for(int i=0; i<n; ++i)
    {
        if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
        {
            val.push(1);
            i+=3;
        }
        else   if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
        {
            val.push(0);
            i+=4;
        }
        else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            val.push(1-nr[s[i+4]-'A']);
            i+=4;
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            op.push(10);
            i+=2;
        }
        else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            op.push(100);
            i+=3;
        }
        else if(s[i]=='(')
            op.push(1000);

        else   if(s[i]>='A' && s[i]<='Z')
            val.push(nr[s[i]-'A']);

        else if(s[i]==')')
            rezolvare();


    }
    rezolvare();
    return val.top();
}


int main()
{
    f.getline(s,1005);
    n=strlen(s);

    f>>m;
    for(int i=1; i<=m; ++i)
    {
        while(!op.empty())
            op.pop();
        while(!val.empty())
            val.pop();
        char c;
        f>>c;
        nr[c-'A']=1-nr[c-'A'];
        g<<evaluare();
    }
    return 0;
}