Cod sursa(job #2011880)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 17 august 2017 14:11:51
Problema Bool Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <stdio.h>
#include <ctype.h>
int v[27];
char aux[1003],s[1001],*p;
int eval()
{
    int x=term();
    while(*p=='|')
    {
        ++p;
        x|=term();
        ++p;
    }
    return x;
}
int term()
{
    int x=nr();
    while(*p=='&')
    {
        ++p;
        x&=nr();
        ++p;
    }
    return x;
}
int nr()
{
    int rez=0,sgn=0;
    if(*p=='-')
        sgn=1,p++;
    if(*p=='(')
    {
        ++p;
        rez=eval();
        ++p;
    }
    else
    {
        if(*p=='0' || *p=='1')
            rez=*p-'0';
        else
        {
            p++;
            rez=v[*(p-1)-'A'];
        }
    }
    return sgn^rez;
}
int main()
{
    int n,m,i;
    char c;
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    n=0;
    do
    {
        aux[n++]=getchar();
    }while(aux[n-1]!='\n');
    m=-1;
    for(i=0; i<n;)
    {
        if(isalpha(aux[i]))
            switch(aux[i])
            {
                case 'A':   m++;
                            if(aux[i+1]=='N')
                                i+=3,s[m]='&';
                            else
                                i++,s[m]='A';
                            break;
                case 'F':   m++;
                            if(aux[i+1]=='A')
                                i+=5,s[m]='0';
                            else
                                i++,s[m]='F';
                            break;
                case 'N':   m++;
                            if(aux[i+1]=='O')
                                i+=3,s[m]='-';
                            else
                                i++,s[m]='N';
                            break;
                case 'O':   m++;
                            if(aux[i+1]=='R')
                                i+=2,s[m]='|';
                            else
                                i++,s[m]='O';
                            break;
                case 'T':   m++;
                            if(aux[i+1]=='R')
                                i+=4,s[m]='1';
                            else
                                i++,s[m]='T';
                            break;
                default:    s[++m]=aux[i++];
            }
        else
            if(aux[i]=='(' || aux[i]==')')
                s[++m]=aux[i++];
            else
                i++;
    }
    scanf("%d",&n);
    getchar();
    for(i=1; i<=n; i++)
    {
        c=getchar();
        v[c-'A']=1-v[c-'A'];
        p=s;
        printf("%d",eval());
    }

    return 0;
}