Cod sursa(job #938597)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 12 aprilie 2013 23:36:10
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.46 kb
#include <fstream>
#include <cstring>
#include <stack>
#define In "bool.in"
#define Out "bool.out"
using namespace std;
bool lit[2013];
stack<int>pa;
int n,na,nc,a[2013],st[2013],vf;
char sir[2013],b[2013],c[2013];
ofstream g(Out);
inline void Codif()
{
    int i;
    nc = 0;
    for(i=0;sir[i];)
    {
        if(sir[i]==' ')
        {
            i++;
            continue ;
        }
        if(sir[i]=='T'&&sir[i+1]=='R'&&sir[i+2]=='U')//TRUE
        {
            c[++nc] = '1';
            i+=4;
            continue;
        }
        if(sir[i]=='F'&&sir[i+1]=='A'&&sir[i+2]=='L')//FALSE
        {
            c[++nc] ='0';
            i+=5;
            continue ;
        }
        if(sir[i]=='N'&&sir[i+1]=='O'&&sir[i+2]=='T')//NOT
        {
            c[++nc] ='n';
            i+=3;
            continue ;
        }
        if(sir[i]=='A'&&sir[i+1]=='N')//AND
        {
            c[++nc] ='a';
            i+=3;
            continue ;
        }
        if(sir[i]=='O'&&sir[i+1]=='R')//OR
        {
            c[++nc] ='o';
            i+=2;
            continue ;
        }
        c[++nc] = sir[i];
        i++;
    }
}

inline void Citire()
{
    ifstream f(In);
    f.getline(sir,1004);
    Codif();
    f>>n;
    f.get();
    f.getline(b,1004);
    f.close();
}

inline void Preproc()
{
    int i;
    na = 0;
    for(i=1;i<=nc;i++)
    {
        if(c[i]=='(')
            a[++na] = -1;
        else
        if(c[i]==')')
            a[++na] = -2;
        else
        if(c[i]=='a')
            a[++na] = -3;
        else
        if(c[i]=='o')
            a[++na] = -4;
        else
        if(c[i]=='n')
            a[++na] = -5;
        else
        if(c[i]=='0'||c[i]=='1')
            a[++na] = c[i]-'0';
        else
            a[++na] = lit[int(c[i])];
    }
}

inline bool Rez(int s,int dr)
{
    int i,j,ok;
//    g<<"(";
//    for(i=s;i<=dr;i++)
//        g<<st[i]<<" ";
//    g<<")\n";
    for(i=dr;i>=s;i--)
        if(st[i]==-5)
        {
            st[i+1] = !st[i+1];
            dr--;
            for(j=i;j<=dr;j++)
                st[j] =st[j+1];
            i = dr+1;
        }
//    g<<"(";
//    for(i=s;i<=dr;i++)
//        g<<st[i]<<" ";
//    g<<")\n";
    for(i=s;i<=dr;i++)
    {
        ok = 0;
        if(st[i]==-3)
            st[i-1] = ((st[i-1])&(st[i+1])),ok=1;
        else
            if(st[i]==-4)
                st[i-1] = ((st[i-1])|(st[i+1])),ok=1;
        if(ok)
        {
            dr-=2;
            for(j=i;j<=dr;j++)
                st[j] = st[j+2];
            i = s;
        }
    }
    return st[s];
}

inline void Afis()
{
    int i;
    for(i=1;i<=vf;i++)
        g<<st[i]<<" ";
    g<<"\n";
}

inline bool Eval()
{
    int i;
    vf = 0;
//    g<<"\n";
//    for(i=1;i<=na;i++)
//        g<<a[i]<<" ";
//    g<<"\n";
    for(i=1;i<=na;i++)
    {
      //  Afis();
        if(a[i]==-1)
        {
            pa.push(vf+1);
            continue;
        }
        if(a[i]==-2)
        {
            st[pa.top()] = Rez(pa.top(),vf);
            vf = pa.top();
            pa.pop();
            continue;
        }
        st[++vf] = a[i];
    }
    return Rez(1,vf);
}

int main()
{
    Citire();
    int i;
    //g<<c+1<<"\n";
    for(i=0;b[i];i++)
    {
        lit[int(b[i])] = !(lit[int(b[i])]);
        Preproc();
        g<<Eval();
    }
    g<<"\n";
    g.close();
    return 0;
}