Cod sursa(job #938480)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 12 aprilie 2013 18:20:37
Problema Bool Scor 0
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,x=0,y=0;
    nc = 0;
    for(i=0;sir[i];)
    {
        if(sir[i]==' ')
            i++;
        if(sir[i]=='T'&&sir[i+1]=='R')//TRUE
        {
            c[++nc] = '1';
            i+=4;
            continue;
        }
        if(sir[i]=='F'&&sir[i+1]=='A')//FALSE
        {
            c[++nc] ='0';
            i+=5;
            continue ;
        }
        if(sir[i]=='N'&&sir[i+1]=='O')//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 ;
        }
        if(sir[i]=='(')
            x++;
        if(sir[i]==')')
            y++;
        c[++nc] = sir[i];
        i++;
    }
    if(x!=y)
        g<<7/0;
}

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,x = 0,y = 0;
    na = 0;
    for(i=1;i<=nc;i++)
    {
        if(c[i]=='(')
        {
            x++;
            a[++na] = -1;
            continue;
        }
        if(c[i]==')')
        {
            y++;
            a[++na] = -2;
            continue;
        }
        if(c[i]=='a')
        {
            a[++na] = -3;
            continue;
        }
        if(c[i]=='o')
        {
            a[++na] = -4;
            continue;
        }
        if(c[i]=='n')
        {
            i++;
            a[++na] = not(lit[int(c[i])]);
            continue;
        }
        if(c[i]=='0'||c[i]=='1')
        {
            a[++na] = c[i]-'0';
            continue;
        }
        a[++na] = lit[int(c[i])];
    }
    if(x!=y)
        g<<7/0;
}

inline bool Rez(int s,int dr)
{
    int i,j;
    /*g<<"(";
    for(i=s;i<=dr;i++)
        g<<st[i]<<" ";
    g<<")\n";*/
    for(i=s+1;i<=dr;i+=2)
    {
        if(st[i]==-3)
            st[i-1] = ((st[i-1])&(st[i+1]));
        else
            st[i-1] = ((st[i-1])|(st[i+1]));
        dr-=2;
        for(j=i;j<=dr;j++)
            st[j] = st[j+2];
        i-=2;
    }
    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++)
    {
        if(a[i]==-1)
        {
            pa.push(vf+1);
            continue;
        }
        if(a[i]==-2)
        {
            if(pa.empty())
            {
                g<<"Eroare\n";
                return 0;
            }
            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;
    Preproc();
    for(i=0;b[i];i++)
    {
        lit[int(b[i])] = !(lit[int(b[i])]);

      //  g<<Eval();
    }
    g<<"\n";
    g.close();
    return 0;
}