Cod sursa(job #650487)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 18 decembrie 2011 11:46:37
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<assert.h>
#include<string.h>

char *p;
int n,u,val[28],sol[200];
char mod[200],a[1200];

void read()
{
    assert(freopen("bool.in","r",stdin)!=NULL);
    int i;
    char c;
    while(scanf("%c",&c)!=EOF)
    {
        if(c=='\n')
            break;
        if(c==' ')
            continue;
        a[++u]=c;
    }

    scanf("%d\n",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%c",&c);
        mod[i]=c;
    }
}

int termen();
int factor();

int eval()
{
    int t=termen();
    while(*p=='O' && *(p+1)=='R')
    {
        p+=2;
        t=t|termen();
    }
    return t;
}

int termen()
{
    int t=factor();
    while(*p=='A' && *(p+1)=='N')
    {
        p+=3;
        t=t&factor();
    }
    return t;
}

int factor()
{
    int t;
    if(*p=='(')
    {
        ++p;
        t=eval();
        ++p;
        return t;
    }
    if(*p=='N' && *(p+1)=='O' && *(p+2)=='T')
    {
        p+=3;
        return !eval();
    }
    if(*p=='F' && *(p+1)=='A' && *(p+2)=='L')
    {
        p+=5;
        return 0;
    }
    if(*p=='T' && *(p+1)=='R')
    {
        p+=4;
        return 1;
    }
    t=val[*p-'A'];
    ++p;
    return t;
}

void solve()
{
    int i;
    for(i=1;i<=n;++i)
    {
        val[mod[i]-'A'] ^= 1;
        p = a + 1;
        sol[i]=eval();
    }
}

void write()
{
    assert(freopen("bool.out","w",stdout)!=NULL);
    int i;
    for(i=1;i<=n;++i)
        printf("%d",sol[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}