Cod sursa(job #915856)

Utilizator cat_red20Vasile Ioana cat_red20 Data 15 martie 2013 13:45:50
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<stdio.h>
#include<string.h>
int prior[256],n,l,uNr,uOp;
char s[1001],stNr[1000],stOp[1000],*p,val[256];
void citire()
{
    freopen("bool.in","r",stdin);
    gets(s);
}

void inlocuire(char op[],char ch)
{
    int l=strlen(op);
    p=strstr(s,op);
    while(p!=NULL)
    {
        strcpy(p,p+l-1);
        s[p-s]=ch;
        p=strstr(s,op);
    }
}

void preproc()
{
    inlocuire("AND",'&');
    inlocuire("OR",'|');
    inlocuire("NOT",'~');
    inlocuire("TRUE",'1');
    inlocuire("FALSE",'0');
    prior['~']=3;
    prior['&']=2;
    prior['|']=1;
    l=strlen(s);
}

char solve(char x,char y,char op)
{
    switch(op)
    {
        case '&': return x&y;
        case '|': return x|y;
    }
}

char evalueaza()
{
    uNr=0;
    uOp=0;
    for(int i=l-1;i>=0;i--)
    {
        if(s[i]=='0' || s[i]=='1')
        {
            stNr[++uNr]=s[i]-'0';
            continue;
        }
        if(s[i]<='Z' && s[i]>='A')
        {
            stNr[++uNr]=val[s[i]];
            continue;
        }
        if(s[i]=='(')
        {
            while(stOp[uOp]!=')')
            {
                stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
                uNr--;
                uOp--;
            }
            uOp--;
            continue;
        }

        if(s[i]=='~')
        {
            stNr[uNr]=1-stNr[uNr];
            continue;
        }
        if(s[i]=='|' || s[i]=='&')
        {
            while(prior[stOp[uOp]]>prior[s[i]] && uOp>0)
            {
                stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
                uNr--;
                uOp--;
            }
            uOp++;
            stOp[uOp]=s[i];
            continue;
        }
        if(s[i]==')')
        {
            stOp[++uOp]=')';
        }
    }
    while(uOp>0 && uNr>1)
    {
         stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
        uNr--;
        uOp--;
    }
    return stNr[1];
}

void rezolva()
{
    char ch;
    freopen("bool.out","w",stdout);
    scanf("%d\n",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%c",&ch);
        val[ch]=1-val[ch];
        printf("%d",evalueaza());
    }
}

int main()
{
    citire();
    preproc();
    rezolva();
    return 0;
}