Cod sursa(job #2643257)

Utilizator adiaioanaAdia R. adiaioana Data 19 august 2020 12:33:41
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda prbd1 Marime 2.07 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");

char *p, str[1010],aux[1010],ch,val[100];
bool ans;
int N;

void cifru();
bool eval();
bool termen();
bool factor();

int main()
{
    cin.getline(str,1001);
    N=strlen(str);
    cifru();
    int nr;
    cin>>nr;
    while(nr--) {
        cin>>ch;
        val[ch-'A']=!val[ch-'A'];
        p=str;
        ans=eval();
        cout<<ans;
    }
    cout<<'\n';//:(
    return 0;
}

void cifru()
{
    int k=0;
    aux[0]='\0';
    for(int i=0; i<N; ++i)
        if(str[i]=='A' && str[i+1]=='N')
        {
            aux[k++]='&';
            aux[k]='\0';
            i+=2;
        }
        else if(str[i]=='O'&&str[i+1]=='R')
        {
            aux[k++]='|';
            aux[k]='\0';
            ++i;
        }
        else if(str[i]=='N'&&str[i+1]=='O')
        {
            aux[k++]='!';
            aux[k]='\0';
            i+=2;
        }
        else if(str[i]=='T' && str[i+1]=='R')
        {
            aux[k++]='1';
            aux[k]='\0';
            i+=3;
        }
        else if(str[i]=='F'&&str[i+1]=='A')
        {
            aux[k++]='0';
            aux[k]='\0';
            i+=4;
        }
        else if(str[i]!=' ')
        {
            aux[k++]=str[i];
            aux[k]='\0';
        }
    str[0]='\0';
    strcpy(str,aux);
    N=strlen(str);
}

bool factor()
{
    bool r=0;
    if(*p=='(')
    {
        p++;
        r=eval();
        p++;
    }
    else if(*p=='!')
    {
        p++;
        r=!factor();
    }
    else if(*p=='1')
    {
        p++;
        r=1;
    }
    else if(*p=='0')
    {
        p++;
        r=0;
    }
    else if(isalpha(*p)){
        r=val[*p-'A'];
        ++p;
    }
    return r;
}

bool termen()
{
    bool r=factor();
    if(*p=='&')
    {
        p++;
        r=r&termen();
    }
    return r;
}

bool eval()
{
    bool r=termen();
    if(*p=='|')
    {
        p++;
        r=r|termen();
    }
    return r;
}