Cod sursa(job #2643384)

Utilizator adiaioanaAdia R. adiaioana Data 19 august 2020 17:54:37
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");

char str[10010], ch,  *p;
int len, val[110];

void cod();
bool result();
bool nmb();
bool term();

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin.getline(str,1001);
    len=strlen(str);
    cod();

    int N;
    cin>>N;
    while(N--)
    {
        cin>>ch;
        val[ch-'A']=!val[ch-'A'];
        p=str;
        cout<<result();
    }
    return 0;
}

bool nmb()
{
    bool r=0;
    if(*p=='!')
    {
        ++p;
        r=term();
    }
    else if(isalpha(*p))
    {
        r=val[(*p-'A')];
        ++p;
    }
    else if(isdigit(*p))
    {
        r=(*p-'0');
        ++p;
    }
    return r;
}

bool term()
{
    bool r=0;
    if(*p=='(')
    {
        ++p;
        r=result();
        ++p;
    }
    else
        r=nmb();
    return r;
}

bool element()
{
    bool r=term();
    if(*p=='&')
    {
        ++p;
        r&=element();
    }
    return r;
}

bool result()
{
    bool r=element();
    if(*p=='|')
    {
        ++p;
        r|=element();
    }
    return r;
}

void cod()
{
    int nlen=0;
    char aux[10010];
    aux[nlen]='\0';
    for(int i=0; i<len; )
        if(isalpha(str[i]) || isdigit(str[i]))
        {
            if(str[i]=='T' && str[i+1]=='R')
            {
                aux[nlen++]='1';
                aux[nlen]='\0';
                i+=4;
            }
            else if(str[i]=='F' && str[i+1]=='A')
            {
                aux[nlen++]='0';
                aux[nlen]='\0';
                i+=5;
            }
            else if(str[i]=='O' && str[i+1]=='R')
            {
                aux[nlen++]='|';
                aux[nlen]='\0';
                i+=2;
            }
            else if(str[i]=='A' && str[i+1]=='N')
            {
                aux[nlen++]='&';
                aux[nlen]='\0';
                i+=3;
            }
            else if(str[i]=='N' && str[i+1]=='O')
            {
                aux[nlen++]='!';
                aux[nlen]='\0';
                i+=3;
            }
            else {
                aux[nlen++]=str[i++];
                aux[nlen]='\0';
            }
        }
        else if(str[i]=='(' || str[i]==')')
        {
            aux[nlen++]=str[i++];
            aux[nlen]='\0';
        }
        else while(i<len && str[i]==' ') ++i;

    str[0]='\0';
    strcpy(str, aux);
    len=nlen;
}