Cod sursa(job #1840658)

Utilizator pibogaBogdan piboga Data 4 ianuarie 2017 18:13:56
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("bool.in");
ofstream fout("bool.out");

char c[1010],a[1010],k,d[1010];
int b[1010],vl[260];
int x,y,i,n,j,p;

void tr()
{
    int m=b[y-1];
    int n=b[y];

    switch (a[x])
    {
        case '!' : { b[y]=!n  ; break; }
        case '&' : { b[--y]=m&n ; break; }
        case '|' : { b[--y]=m|n ; break; }
    }

    --x;

}

void dcd()
{
    ++i;

    if (c[i]<'A' || c[i]>'Z')
    {
        b[++y]=vl[c[i-1]];
        --i;
    }

    else if (c[i]=='O')
    {
        a[++x]='!';
        ++i;
    }

    else if (c[i]=='N')
    {
        if (vl[a[x]] <= vl['&'])
            a[++x]='&';
        else
        {
            tr();
            a[++x]='&';
        }
        ++i;
    }

    else if(c[i]=='R')
    {
        ++i;

        if (c[i]=='U')
        {
            b[++y]=1;
            i++;
        }

        else
        {
            if (vl[a[x]] <= vl['|'])
                a[++x]='|';

            else
            {
                tr();
                a[++x]='|';
            }
            --i;
        }
    }



    else
    {
        b[++y]=0;
        i+=3;
    }
}


int main()
{
    fin.getline (c+1,1010);
    n=strlen(c+1);

    vl['!']=3; vl['&']=2; vl['|']=1;

    fin>>p;
    //fin >> k;
    fin>>d;

    c[0]='('; c[n+1]=')';

    if (p==0)
        p=1;

    for (j=0;j<p;++j)
    {
        vl[d[j]]=!vl[d[j]];

        x=y=0;

        for (i=0;i<=n+1; ++i)
        {
            if (c[i]=='(')
            {
                a[++x]='(';
            }

            else
                if ( c[i]==')' )
                {
                    while (a[x]!='(')
                    {
                        tr();
                    }

                    --x;
                }

            else if (c[i]==' ')
            {
                ;
            }

            else
            {
                dcd();

            }

        }

        fout << b[1];

    }


    return 0;
}