Cod sursa(job #907808)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 8 martie 2013 12:56:31
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int n, i, m, j, p, u;
char s[2010], c[110], *a;
bool v[110];

int OR();
int AND();
int NSP();

int AND(){
    int rez=NSP();
    while( (*a)=='&' )
    {
        p++;
        rez&=NSP();
    }
    return rez;
}

int NSP(){
    int rez;
    if( (*a)=='(' )
    {
        p++;
        rez=OR();
        p++;
    }
    else
    {
        if( (*a) == '^' )
        {
            p++;
            rez=NSP();
            rez^=1;
        }
        else
        {
            if( (*a)=='1' )
            {
                rez = 1;
                p++;
            }
            else
            {
                if( (*a)=='0' )
                {
                    rez=0;
                    p++;
                }
                else
                {
                    rez=v[ (*a)-'A' ];
                    p++;
                }
            }
        }
    }
    return rez;
}

int OR(){
    int rez=AND();
    while( (*a)== '|' )
    {
        p++;
        rez|=AND();
    }
    return rez;
}

int main(){
    f.get(s+1, 2000);
    f.get();
    f>>n;
    f.get();
    f.get(c, n);
    f.close();
    m=strlen(s+1);
    for(i=1; i<=m; i++)
    {
        if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            strcpy(s+i+1, s+i+3);
            s[i]='&';
            m-=2;
        }
        else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
        {
            strcpy(s+i+1, s+i+4);
            s[i]='1';
            m-=3;
        }
        else if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
        {
            strcpy(s+i+1, s+i+5);
            s[i]='0';
            m-=4;
        }
        else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            strcpy(s+i+1, s+i+3);
            s[i]='^';
            m-=2;
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            strcpy(s+i+1, s+i+2);
            s[i]='|';
            m--;
        }
    }
    p=2;
    u=2;
    j=m;
    while(u<=m)
    {
        if(s[u]==' ')
        {
            j--;
            u++;
        }
        s[p]=s[u];
        p++;
        u++;
    }
    s[u+1]='\n';
    for(i=0; i<n; i++)
    {
        v[ c[i]-'A' ]^=1;
        a=s;
        g<<( OR()^1 );
    }
    g.close();
    return 0;
}