Cod sursa(job #2815773)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 10 decembrie 2021 11:37:56
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.05 kb
#include<fstream>
#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

//ifstream f("in.in");
//ofstream g("out.out");

ifstream f("bool.in");
ofstream g("bool.out");

bool expresie();
bool caracter();

char s[1003],u[300];
int i=0;

int main()
{
    for(int l=1;l<=298;l++)
        u[l]=0;

    f.get(s,1001);

    int n;
    char c;
    f>>n;
    for(int ll=1;ll<=n;ll++)
    {
        f>>c;
        i=0;
        u[int(c)]=1-u[int(c)];
        g<<expresie();
        //cout<<'\n'<<"--------------------"<<'\n'<<'\n';
    }
    f.close();
    g.close();
    return 0;
}

bool expresie()
{
    int k=0;
    short v[1001];

    ///cout<<"x"<<'\n';
    int r=caracter();
    k++;
    v[k]=r;

    i++;
    while(((s[i]=='O'&&s[i+1]=='R')||
          (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')||
          (s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T'))
            &&i<=strlen(s))
    {
        if(s[i]=='O'&&s[i+1]=='R')
        {
            i+=3;
            k++;
            v[k]=-1;
            if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
            {
                i+=4;
                r=caracter();

                k++;
                v[k]=-3;
                k++;
                v[k]=r;
            }
            else
            {
                r=caracter();
                k++;
                v[k]=r;
            }
        }
        else if(s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
        {
            i+=4;
            k++;
            v[k]=-2;
            if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
            {
                i+=4;
                r=caracter();

                k++;
                v[k]=-3;
                k++;
                v[k]=r;
            }
            else
            {
                r=caracter();
                k++;
                v[k]=r;
            }
        }
        else if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
        {
            i+=4;
            r=caracter();

            k++;
            v[k]=-3;
            k++;
            v[k]=r;
        }

        if(s[i]==' ')
        {
            i++;
        }
        else
        {
            ///cout<<"No i++ for i="<<i<<"   ";
        }
    }

    /**for(int j=1;j<=k;j++)
        cout<<v[j]<<" ";
    cout<<'\n';**/

    for(int ii=1;ii<k;ii++)
    {
        if(v[ii]==-3)
        {
            v[ii+1]=1-v[ii+1];
            for(int j=ii;j<=k-1;j++)
                v[j]=v[j+1];
            k--;
        }
    }

    /**for(int j=1;j<=k;j++)
        cout<<v[j]<<" ";
    cout<<'\n';**/

    for(int ii=1;ii<k;ii++)
    {
        if(v[ii]==-2)
        {
            v[ii+1]=v[ii-1]&&v[ii+1];
            for(int j=ii-1;j<=k-2;j++)
                v[j]=v[j+2];
            k-=2;
        }
    }

    /**for(int j=1;j<=k;j++)
        cout<<v[j]<<" ";
    cout<<'\n';**/

    for(int ii=1;ii<k;ii++)
    {
        if(v[ii]==-1)
        {
            v[ii+1]=v[ii-1]||v[ii+1];

            for(int j=ii-1;j<=k-2;j++)
                v[j]=v[j+2];

            k-=2;
        }
    }


    /**for(int j=1;j<=k;j++)
        cout<<v[j]<<" ";
    cout<<'\n';

    cout<<'\n'<<"v[1] = "<<v[1]<<'\n';
    cout<<"endX: "<<i;**/

    return v[1];
}

bool caracter()
{
    //cout<<i<<"|"<<s[i]<<": ";
    if(s[i]=='(')
    {
        i++;
        int r=expresie();
        i++;
        //while(s[i]==' ')
            //i++;

        //cout<<r<<'\n';
        ///cout<<'\n';
        return r;
    }
    else
    {
        if(s[i]=='T'&&s[i+1]=='R'&&s[i+2]=='U'&&s[i+3]=='E')
        {
            i+=5;
            ///cout<<1<<'\n';
            return 1;
        }
        else if(s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S'&&s[i+4]=='E')
        {
            i+=6;
            ///cout<<0<<'\n';
            return 0;
        }
        else
        {
            int r=u[(int)s[i]];
            i++;
            ///cout<<"ch: "<<r<<'\n';
            return r;
        }
    }
}