Cod sursa(job #3250786)

Utilizator alexdraguAlexandru Dragu alexdragu Data 23 octombrie 2024 17:06:15
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[10005],ch,p[10005];
bool t[1005];
int i,x,nr,n,j;

bool sau();
bool si();
bool factor();
bool nu();

int main()
{
    fin.getline(p,10000);
    x=strlen(p);
    for(i=0;i<x;i++)
    {
        if(i<x-2&&p[i]=='N'&&p[i+1]=='O')
        {
            s[nr]='!';
            nr++;
            i+=2;
        }
        else if(i<x-2&&p[i]=='A'&&p[i+1]=='N')
        {
            s[nr]='&';
            nr++;
            i+=2;
        }
        else if(i<x-1&&p[i]=='O'&&p[i+1]=='R')
        {
            s[nr]='|';
            nr++;
            i+=1;
        }
        else if(i<x-3&&p[i]=='T'&&p[i+1]=='R')
        {
            s[nr]='1';
            nr++;
            i+=3;
        }
        else if(i<x-4&&p[i]=='F'&&p[i+1]=='A')
        {
            s[nr]='0';
            nr++;
            i+=4;
        }
        else if(p[i]>='A'&&p[i]<='Z')
        {
            s[nr]=p[i];
            nr++;
        }
    }

    fin>>n;
    for(j=1;j<=n;j++)
    {
        fin>>ch;
        t[ch-'A']=1-t[ch-'A'];
        i=0;
        fout<<sau();
    }
    return 0;
}

bool sau()
{
    bool r=si();
    while(i<nr&&s[i]=='|')
    {
        i++;
        r=(r|si());
    }
    return r;
}
bool si()
{
    bool r=nu();
    while(i<nr&&s[i]=='&')
    {
        i++;
        r=(r&nu());
    }
    return r;
}
bool nu()
{
    if(s[i]=='!')
    {
        while(i<nr&&s[i]=='!')
        {
            i++;
            return 1-nu();
        }
    }
    else return factor();
}
bool factor()
{
    bool r=0;
    if(s[i]=='(')
    {
        i++;
        r=sau();
        i++;
    }
    else if(s[i]>='0'&&s[i]<='1')
    {
        r=s[i]-'0';
        i++;
    }
    else if(s[i]>='A'&&s[i]<='Z')
    {
        r=t[s[i]-'A'];
        i++;
    }
    return r;
}