Cod sursa(job #1557925)

Utilizator ASTELOTudor Enescu ASTELO Data 28 decembrie 2015 14:27:22
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.22 kb
#include<cstdio>
#include<cstring>
char s[1007],s1[1007],vc[1001],c;
int i=-1,j,n,m,pp,v[27],cate;
int eval();
int eval1();
int eval2();
int main ()
{
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
gets(s1);
n=strlen(s1);
scanf("%d",&m);
scanf("%c",&c);
for(i=1;i<=m;i++)
    scanf("%c",&vc[i]);
for(i=0;i<n;i++)
    {
    if(s1[i]=='N'&&s1[i+1]=='O'&&s1[i+2]=='T')
        {
        s[++cate]='!';
        i+=2;
        }
    else
        if(s1[i]=='A'&&s1[i+1]=='N'&&s1[i+2]=='D')
            {
            s[++cate]='&';
            i+=2;
            }
        else
            if(s1[i]=='O'&&s1[i+1]=='R')
                {
                s[++cate]='|';
                i++;
                }
            else
                if(s1[i]=='F'&&s1[i+1]=='A')
                    {
                    s[++cate]='0';
                    i+=4;
                    }
                else
                    if(s1[i]=='T'&&s1[i+1]=='R')
                        {
                        s[++cate]='1';
                        i+=3;
                        }
                    else
                        if(s1[i]!=' ')
                            s[++cate]=s1[i];
    }
for(j=1;j<=m;j++)
    {
    v[vc[j]-'A']=1-v[vc[j]-'A'];
    int nr=-1;
    for(i=1;i<cate;)
        {
        if(s[i]>='A'&&s[i]<='Z')
            {
            if(pp==0)
                nr=v[s[i]-'A'];
            else
                nr=1-v[s[i]-'A'];
            i++;
            }
        if(s[i]>='0'&&s[i]<='1')
            {
            if(pp==0)
                nr=s[i]-'0';
            else
                nr=1-(s[i]-'0');
            i++;
            }
        if(s[i]=='|')
            nr=nr|eval();
        if(s[i]=='&')
            nr=nr&eval();
        if(s[i]=='!')
            pp=1;
        if(s[i]=='(')
            nr=eval2();
        while(s[i]==')')
            i++;
        }
    printf("%d",nr);
    }
return 0;
}
int eval()
    {
    i++;
    int nr=-1;
    int pp=0;
    if(s[i]=='!')
        {
        pp=1;
        i++;
        }
    if(s[i]>='A'&&s[i]<='Z')
        {
        if(pp==0)
            nr=v[s[i]-'A'];
        else
            nr=1-v[s[i]-'A'];
        i++;
        }
    if(s[i]>='0'&&s[i]<='1')
        {
        if(pp==0)
            nr=s[i]-'0';
        else
            nr=1-(s[i]-'0');
        i++;
        }
    if(s[i]=='(')
        if(pp==0)
            return eval2();
        else
            return 1-eval2();
    else
        return nr;
    }
int eval2()
    {
    i++;
    int nr=-1;
    while(s[i]!=')')
        {
        if(s[i]>='A'&&s[i]<='Z')
            {
            if(pp==0)
                nr=v[s[i]-'A'];
            else
                nr=1-v[s[i]-'A'];
            i++;
            }
        if(s[i]>='0'&&s[i]<='1')
            {
            if(pp==0)
                nr=s[i]-'0';
            else
                nr=1-(s[i]-'0');
            i++;
            }
        if(s[i]=='|')
            nr=nr|eval();
        if(s[i]=='&')
            nr=nr&eval();
        if(s[i]=='!')
            pp=1;
        if(s[i]=='(')
            nr=eval2();
        }
    i++;
    return nr;
    }