Cod sursa(job #1780077)

Utilizator UrsuDanUrsu Dan UrsuDan Data 15 octombrie 2016 20:35:22
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("bool.in");
ofstream out ("bool.out");

char s[1050];
char notf[4] = {'N','O','T'};
char andf[4]={'A','N','D'};
char orf[4]={'O','R'};
char truf[7]={'T','R','U','E'};
char falsf[7]={'F','A','L','S','E'};

int poz;
int val[35];

int crt();
bool expresie();
bool termen();

int crt()
{
    int i;
    bool ok=1;
    for(i=0; i<=2; i++)
        if(s[i+poz]!=andf[i])
            ok=0;
    if(ok==1)
    {
        poz+=4;
        return 2;
    }
    ok=1;
    for(i=0; i<=2; i++)
        if(s[i+poz]!=notf[i])
            ok=0;
    if(ok==1)
    {
        poz+=6;
        return !val[s[poz-2]-'A'];
    }
    ok=1;
    for(i=0; i<=1; i++)
        if(s[i+poz]!=orf[i])
            ok=0;
    if(ok==1)
    {
        poz+=3;
        return 3;
    }
    ok=1;
    for(i=0; i<=3; i++)
        if(s[i+poz]!=truf[i])
            ok=0;
    if(ok==1)
    {
        poz+=5;
        return 1;
    }
    ok=1;
    for(i=0; i<=4; i++)
        if(s[i+poz]!=falsf[i])
            ok=0;
    if(ok==1)
    {
        poz+=6;
        return 0;
    }
    poz+=2;
    return val[s[poz-2]-'A'];
}

bool termen()
{
    bool ans;
    if(s[poz]=='(')
    {
        poz++;
        ans=expresie();
    }
    else
        ans=crt();
    return ans;
}

bool expresie()
{
    bool ans=termen();
    int t;
    do
    {
        t=crt();
        if(t==2)
            ans=ans && termen();
        else if(t==3)
            ans=ans || termen();
    }while(t==2 || t==3);
    return ans;
}

int main()
{
    int n,i;
    char c;
    in.get(s,1050);
    in>>n;
    for(i=1;i<=n;i++)
    {
        in>>c;
        val[c-'A']=1-val[c-'A'];
        poz=0;
       out<<expresie();
    }
    return 0;
}