Cod sursa(job #2128789)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 12 februarie 2018 06:43:51
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.48 kb
#include<fstream>
#include<cstring>
#include<cctype>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
const int nmax=1000;
char s[nmax+5]; int n;
int value[30];
int m;
char ch;
int stiva_nr[nmax+5],vf_nr;
int stiva_semne[nmax+5],vf_semne;
bool cif(char X)
{
    if('A'<=X and X<='Z')
        return 1;
    return 0;
}
int evaluare()
{
    vf_nr=vf_semne=0;
    int poz=0;
    while(poz<n)
    {
        if(cif(s[poz]))
        {
            if(poz+1==n or !cif(s[poz+1]))
            {
                stiva_nr[++vf_nr]=value[s[poz]-'A'];
                poz++;
                continue;
            }
            if(s[poz]=='T' and s[poz+1]=='R' and s[poz+2]=='U' and s[poz+3]=='E')
            {
                stiva_nr[++vf_nr]=1;
                poz+=4;
                continue;
            }
            if(s[poz]=='F' and s[poz+1]=='A' and s[poz+2]=='L' and s[poz+3]=='S' and s[poz+4]=='E')
            {
                stiva_nr[++vf_nr]=0;
                poz+=5;
                continue;
            }
        }
        if(s[poz]==' ')
        {
            poz++;
            continue;
        }
        if(s[poz]=='(')
        {
            stiva_semne[++vf_semne]='(';
            poz++;
            continue;
        }
        if(s[poz]==')')
        {
            ///cout<<"START\n";
            ///cout<<vf_semne<<"\n";
            while(stiva_semne[vf_semne]!='(')
            {
                if(stiva_semne[vf_semne]=='1')
                {
                    stiva_nr[vf_nr]=1-stiva_nr[vf_nr];
                    vf_semne--;
                    continue;
                }
                vf_nr--;
                if(stiva_semne[vf_semne]=='2')
                    stiva_nr[vf_nr]=(stiva_nr[vf_nr]&&stiva_nr[vf_nr+1]);
                if(stiva_semne[vf_semne]=='3')
                    stiva_nr[vf_nr]=(stiva_nr[vf_nr]||stiva_nr[vf_nr+1]);
                vf_semne--;
            }
            vf_semne--;
            poz++;
            continue;
        }
        if(s[poz]=='N' and s[poz+1]=='O' and s[poz+2]=='T')
        {
            while(vf_semne and stiva_semne[vf_semne]=='1')
            {
                vf_semne--;
                stiva_nr[vf_nr]=1-stiva_nr[vf_nr];
            }
            stiva_semne[++vf_semne]='1';
            poz+=3;
            continue;
        }
        if(s[poz]=='A' and s[poz+1]=='N' and s[poz+2]=='D')
        {
            while(vf_semne and (stiva_semne[vf_semne]=='1' or stiva_semne[vf_semne]=='2'))
            {
                if(stiva_semne[vf_semne]=='1')
                {
                    stiva_nr[vf_nr]=1-stiva_nr[vf_nr];
                    vf_semne--;
                    continue;
                }
                vf_nr--;
                if(stiva_semne[vf_semne]=='2')
                    stiva_nr[vf_nr]=(stiva_nr[vf_nr]&&stiva_nr[vf_nr+1]);
                vf_semne--;
            }
            poz+=3;
            stiva_semne[++vf_semne]='2';
            continue;
        }
        if(s[poz]=='O' and s[poz+1]=='R')
        {
            while(vf_semne and stiva_semne[vf_semne]!='(')
            {
                if(stiva_semne[vf_semne]=='1')
                {
                    stiva_nr[vf_nr]=1-stiva_nr[vf_nr];
                    vf_semne--;
                    continue;
                }
                vf_nr--;
                if(stiva_semne[vf_semne]=='2')
                    stiva_nr[vf_nr]=(stiva_nr[vf_nr]&&stiva_nr[vf_nr+1]);
                if(stiva_semne[vf_semne]=='3')
                    stiva_nr[vf_nr]=(stiva_nr[vf_nr]||stiva_nr[vf_nr+1]);
                vf_semne--;
            }
            poz+=2;
            stiva_semne[++vf_semne]='3';
        }
    }
    while(vf_semne)
    {
        if(stiva_semne[vf_semne]=='1')
        {
            stiva_nr[vf_nr]=1-stiva_nr[vf_nr];
            vf_semne--;
            continue;
        }
        vf_nr--;
        if(stiva_semne[vf_semne]=='2')
            stiva_nr[vf_nr]=(stiva_nr[vf_nr]&&stiva_nr[vf_nr+1]);
        if(stiva_semne[vf_semne]=='3')
            stiva_nr[vf_nr]=(stiva_nr[vf_nr]||stiva_nr[vf_nr+1]);
        vf_semne--;
    }
    return stiva_nr[1];
}
/**
1 = NOT
2 = AND
3 = OR

**/
int main()
{
    fin.getline(s,nmax+5);
    n=strlen(s);
    fin>>m;
    fin.get();
    for(int i=1;i<=m;i++)
    {
        ch=fin.get();
        value[ch-'A']=1-value[ch-'A'];
        fout<<evaluare();
    }
    return 0;
}