Cod sursa(job #3250784)

Utilizator amunnumeVlad Patrascu amunnume Data 23 octombrie 2024 17:03:50
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>
#define N 100005
#define L 130
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
bool si();
bool sau();
bool nu();
bool factor();
int n,i,j,x,q,val[L];
char s[N],t[N],init[N];
void initialise()
{
    fin.getline(init,N-2);
    n=strlen(init);
    for(i=0;i<n;++i)
    {
        if(init[i]==' ') continue;
        else if(init[i]=='T' && init[i+1]=='R')
        {
            s[j]='1';
            j++;
            i+=3;
        }
        else if(init[i]=='F' && init[i+1]=='A')
        {
            s[j]='0';
            j++;
            i+=4;
        }
        else if(init[i]=='N' && init[i+1]=='O')
        {
            s[j]='!';
            j++;
            i+=2;
        }
        else if(init[i]=='A' && init[i+1]=='N')
        {
            s[j]='&';
            j++;
            i+=2;
        }
        else if(init[i]=='O' && init[i+1]=='R')
        {
            s[j]='|';
            j++;
            i++;
        }
        else
        {
            s[j]=init[i];
            j++;
        }
    }
    n=j;
}
void become()
{
    for(i=0;i<n;++i)
    {
        if('A'<=s[i] && s[i]<='Z') t[i]=val[s[i]]+'0';
        else t[i]=s[i];
    }

}
int main()
{
    initialise();

    fin>>q;
    while(q--)
    {
        char ch;
        fin>>ch;
        val[ch]=1-val[ch];
        become();
        i=0;
        fout<<sau();
    }
    return 0;
}
bool sau()
{
    bool x=si();
    while(i<n && t[i]=='|')
    {
        i++;
        x|=si();
    }
    return x;
}
bool si()
{
    bool x=nu();
    while(i<n && t[i]=='&')
    {
        i++;
        x&=nu();
    }
    return x;
}
bool nu()
{
    if(t[i]=='!')
    {
        while(i<n && t[i]=='!')
        {
            i++;
            return 1-nu();
        }
    }
    else
        return factor();
}
bool factor()
{
    int x=0;
    if(t[i]=='(')
    {
        i++;
        x=sau();
        i++;
    }
    else
    {
        x=t[i]-'0';
        i++;
    }
    return x;
}