Cod sursa(job #938275)

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

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

inline void Preproc(char *s)
{
    int i;
    na = 0;
    for(i=0;s[i];i++)
    {
        if(s[i]=='(')
        {
            a[++na] = -1;
            continue;
        }
        if(s[i]==')')
        {
            a[++na] = -2;
            continue;
        }
        if(s[i]=='a')
        {
            a[++na] = -3;
            continue;
        }
        if(s[i]=='o')
        {
            a[++na] = -4;
            continue;
        }
        if(s[i]=='n')
        {
            i++;
            a[++na] = not(lit[int(s[i])]);
            continue;
        }
        if(s[i]=='0'||s[i]=='1')
        {
            a[++na] = s[i]-'0';
            continue;
        }
        a[++na] = lit[int(s[i])];
    }
}

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
            if(st[i]==-4)
                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;
    for(i=1;i<=na;i++)
    {
        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;
    for(i=0;i<n;i++)
    {
        lit[int(b[i])] = (not(lit[int(b[i])]));
        Preproc(c+1);
        g<<Eval();
    }
    g<<"\n";
    g.close();
    return 0;
}