Cod sursa(job #2721004)

Utilizator marcumihaiMarcu Mihai marcumihai Data 11 martie 2021 14:48:01
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
/*
 True -1
 False -2
 NOT  -10
 AND -100
 OR  -200
 (   -1000
  )  -2000
*/
char a[10005];
int fr[30];
int paranteze[10001];
int trans[10005];
int n;
int m;

int eval(int st, int dr)
{
    int val[10005]= {0};
    int x=0;
    for(int i=st; i<=dr; ++i)
    {
        if(trans[i]==-10) ///not
        {
            if(trans[i+1]==-1000)
            {
                val[++x]=1-eval(i+3, paranteze[i+1]-1);
                i=paranteze[i+1]+1;
            }
            else if(trans[i+1]>=0 && trans[i+1]<30)
            {
                val[++x]=1-fr[trans[i+1]];
                i=i+2;
            }
        }
        else if(trans[i]==-1)
            val[++x]=1;
        else if(trans[i]==-2)
            val[++x]=0;
        else if(trans[i]==-100)
            val[++x]=-100;
        else if(trans[i]==-200)
            val[++x]=-200;
        else if(trans[i]==-1000)
        {
            val[++x]=eval(i+1, paranteze[i]-1);
            i=paranteze[i]+1;
        }
        else if(trans[i]>=0 && trans[i]<30)
            val[++x]=fr[trans[i]];

    }
    int lung=0;
    int ajut[10000]= {0};
    for(int i=1; i<=x; ++i)
    {
        if(val[i]==0 || val[i]==1)
            ajut[++lung]=val[i];
        else if(val[i]==-100 )
        {
            ajut[lung]=ajut[lung]&val[i+1];
            ++i;
        }
        else
            ajut[++lung]=val[i];
    }
    int v=ajut[1];
    for(int i=2; i<=lung; ++i)
        if(ajut[i]==-200 && i+1<=lung )
        {
            v=v|ajut[i+1];
            ++i;
        }
    return v;
}
int main()
{
    f.getline(a,1005);
    n=strlen(a);
    int nr=0;
    for(int i=0; i<n; ++i)
    {
        if(a[i]=='T' && a[i+1]=='R' && a[i+2]=='U' && a[i+3]=='E')
        {
            trans[++nr]=-1;
            i+=4;
        }
        else if(a[i]=='F' && a[i+1]=='A' && a[i+2]=='L' && a[i+3]=='S' && a[i+4]=='E')
        {
            trans[++nr]=-2;
            i+=5;
        }
        else if(a[i]=='N' && a[i+1]=='O' && a[i+2]=='T')
        {
            trans[++nr]=-10;
            i+=3;
        }
        else if(a[i]=='A' && a[i+1]=='N' && a[i+2]=='D')
        {
            trans[++nr]=-100;
            i+=3;
        }
        else if(a[i]=='O' && a[i+1]=='R')
        {
            trans[++nr]=-200;
            i+=2;
        }
        else if(a[i]=='(')
            trans[++nr]=-1000;
        else if(a[i]==')')
            trans[++nr]=-2000;

        else if(a[i]>='A' && a[i]<='Z')
        {
            trans[++nr]=a[i]-'A';
        }


    }
    for(int i=1;i<=nr;++i)
        cout<<trans[i]<<" ";
    cout<<"\n";
    stack <int> par;
    for(int i=1; i<=nr; ++i)
    {
        if(trans[i]==-1000)
            par.push(i);
        if(trans[i]==-2000)
        {
            paranteze[par.top()]=i;
            par.pop();

        }
    }
    for(int i=1; i<=n; ++i)
        cout<<paranteze[i]<<" ";
    f>>m;
    for(int i=1; i<=m; ++i)
    {

        char c;
        f>>c;
        fr[c-'A']=1-fr[c-'A'];
        g<<eval(1,n);
    }
    return 0;
}