Cod sursa(job #536059)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 18 februarie 2011 10:02:22
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<cstdio>
bool val[26];
char sch[105],v[1005],s[1005],si[1005];
int n,poz;
void edit()
{
    int q=0;
    for(int i=0;si[i];i++)
    {
        if(si[i]==' ')
            continue;
        if(si[i]=='N' && si[i+1]=='O' && si[i+2]=='T')
        {
            i+=2;
            s[q++]='!';
            continue;
        }
        if(si[i]=='O' && si[i+1]=='R')
        {
            i+=1;
            s[q++]='|';
            continue;
        }
        if(si[i]=='A' && si[i+1]=='N' && si[i+2]=='D')
        {
            i+=2;
            s[q++]='&';
            continue;
        }
        if(si[i]=='T' && si[i+1]=='R' && si[i+2]=='U' && si[i+3]=='E')
        {
            i+=3;
            s[q++]='1';
            continue;
        }
        if(si[i]=='F' && si[i+1]=='A' && si[i+2]=='L' && si[i+3]=='S' && si[i+4]=='E')
        {
            i+=4;
            s[q++]='0';
            continue;
        }
        if(si[i]=='(')
        {
            s[q++]='(';
            continue;
        }
        if(si[i]==')')
        {
            s[q++]=')';
            continue;
        }
        s[q++]=si[i];
    }
}
void make_string()
{
    for(int i=0;s[i];i++)
    {
        if(s[i]=='(' || s[i]=='1' || s[i]=='0' || s[i]==')' || s[i]=='|' || s[i]=='&' || s[i]=='!')
        {
            v[i]=s[i];
            continue;
        }
        v[i]=val[s[i]-'A']+'0';
    }
}
bool eval();
bool term();
bool fact()
{
    bool semn=1,rc;
    if(v[poz]=='!')
    {
        poz++;
        semn=0;
    }
    if(v[poz]=='(')
    {
        poz++;
        rc=eval();
        poz++;
        return (semn&&rc);
    }
    rc=v[poz]-'0';
    return (semn&&rc);
}
bool term()
{
    bool rc=fact();
    while(v[poz]=='&')
    {
        poz++;
        rc=(rc&fact());
    }
    return rc;
}
bool eval()
{
    bool rc=term();
    while(v[poz]=='|')
    {
        poz++;
        rc=(rc|term());
    }
    return rc;
}
int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    gets(si);
    edit();
    scanf("%d\n",&n);
    gets(sch);
    for(int i=0;i<n;i++)
    {
        poz=0;
        val[sch[i]-'A']=!val[sch[i]-'A'];
        make_string();
        printf("%d",eval());
    }
    return 0;
}