Cod sursa(job #1161749)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 31 martie 2014 13:55:07
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <cstring>
#include <string>
#include <bitset>

using namespace std;

string expr[1005];
bitset<30> frecv;
int unde,poz;

bool termen();
bool factor();

bool eval()
{
    bool x=termen();

    while(expr[unde]=="OR" && unde<=poz)
    {
        unde++;
        int y=termen();
        x|=y;
    }

    return x;
}

bool termen()
{
    bool x=factor();

    while(expr[unde]=="AND" && unde<=poz)
    {
        unde++;
        int y=factor();
        x&=y;
    }

    return x;
}

bool factor()
{
    bool semn=0;
    while(expr[unde]=="NOT")
        semn=1-semn,unde++;

    if(expr[unde]=="(")
    {
        unde++;
        int y=eval();
        unde++;

        if(semn)
            return 1-y;
        return y;
    }

    if(expr[unde]=="TRUE")
    {
        unde++;
        if(semn)
            return 0;
        return 1;
    }
    if(expr[unde]=="FALSE")
    {
        unde++;
        if(semn)
            return 1;
        return 0;
    }

    if(semn)
        return 1-frecv[expr[unde++][0]-'A'];
    return frecv[expr[unde++][0]-'A'];
}

int main()
{
    ifstream cin("bool.in");
    ofstream cout("bool.out");

    int n,i;
    char sir[1005];
    cin.get(sir,1005);
    n=strlen(sir);

    string curent="";
    for(i=0;i<n;i++)
    {
        //cout<<"i="<<i<<endl;
        if(sir[i]=='(' || sir[i]==')')
        {
            //cout<<"aici"<<endl;
            if(curent!="")
                expr[++poz]=curent;
            expr[++poz]=sir[i];
            curent="";
        }
        else if(sir[i]==' ')
        {
            //cout<<"aici2"<<endl;
            if(curent!="")
            //{
              //  cout<<"intru"<<endl;
                expr[++poz]=curent;
            //}
            //cout<<"trecut"<<endl;
            curent="";
        }
        else
        {
            //cout<<"aici3"<<endl;
            curent+=sir[i];
        }
    }
    //cout<<"aici"<<endl;

    if(curent!="")
        expr[++poz]=curent;

    int cate;
    cin>>cate;

    char schimb[105];
    cin.get();
    cin.get(schimb,105);

    for(i=0;i<cate;i++)
    {
        frecv[schimb[i]-'A']=1-frecv[schimb[i]-'A'];
        unde=1;

        cout<<eval();
    }

    cout<<'\n';

    cin.close();
    cout.close();
    return 0;
}