Cod sursa(job #3250764)

Utilizator alexdraguAlexandru Dragu alexdragu Data 23 octombrie 2024 16:40:27
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005],ch,p[1005];
bool t[30];
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(p[i]=='N'&&p[i+1]=='O')
        {
            s[nr]='!';
            nr++;
        }
        else if(p[i]=='A'&&p[i+1]=='N')
        {
            s[nr]='&';
            nr++;
        }
        else if(p[i]=='O'&&p[i+1]=='R')
        {
            s[nr]='|';
            nr++;
        }
        else if(p[i]=='T'&&p[i+1]=='R')
        {
            s[nr]='1';
            nr++;
        }
        else if(p[i]=='F'&&p[i+1]=='A')
        {
            s[nr]='0';
            nr++;
        }
        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(s[i]=='|')
    {
        i++;
        r=(r|si());
    }
    return r;
}
bool si()
{
    bool r=nu();
    while(s[i]=='&')
    {
        i++;
        r=(r&nu());
    }
    return r;
}
bool nu()
{
    if(s[i]=='!') return 1-factor();
    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';
    }
    else if(s[i]>='A'&&s[i]<='Z')
    {
        r=t[s[i]-'A'];
    }
    return r;
}