Cod sursa(job #1833369)

Utilizator ipus1Stefan Enescu ipus1 Data 22 decembrie 2016 10:46:17
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include<cstdio>
#include<cstring>
char v[1001],vec[1010];
bool vc[27];
int q,n;
bool exp();
bool term();
bool fact();
bool exp()
    {bool rez;
    int pp=0;
    if(v[q]=='(')
        {q++;
        pp=1;
        rez=term();
        }
    else
        if(pp==0&&((v[q]>='A'&&v[q]<='Z')||v[q]==0||v[q]==1))
            {pp=1;
            rez=term();
            }
    while(q<n&&v[q]=='|')
        {q++;
        rez=(rez|term());
        }
    q++;
    return rez;
    }
bool term()
    {int pp=0;
    while(v[q]=='!')
        {pp=1-pp;
        q++;
        }
    if(pp==0)
        return fact();
    else
        return (!fact());
    }
bool fact()
    {bool rez;
    if(v[q]==0)
        {q++;
        rez=0;
        }
    else
        if(v[q]==1)
            {q++;
            rez=1;
            }
        else
            if(v[q]>='A'&&v[q]<='Z')
                {rez=vc[v[q]-'A'+1];
                q++;
                }
            else
                if(v[q]=='(')
                   {q++;
                   rez=exp();
                   }
    if(v[q]=='&')
        {q++;
        rez=(rez&exp());
        }
    return rez;
    }
int main ()
{freopen ("bool.in","r",stdin);
freopen ("bool.out","w",stdout);
int m,i,j,k;
char a;
gets(vec);
scanf("%d ",&m);
k=strlen(vec);
n=0;
for(i=0;i<k;i++)
    if(vec[i]!=' ')
        if(vec[i]=='('||vec[i]==')')
            {n++;
            v[n]=vec[i];
            }
        else if(vec[i]=='T'&&vec[i+1]=='R')
            {n++;
            i+=3;
            v[n]=1;
            }
        else if(vec[i]=='F'&&vec[i+1]=='A')
            {n++;
            i+=4;
            v[n]=0;
            }
        else if(vec[i]=='A'&&vec[i+1]=='N')
            {n++;
            i+=2;
            v[n]='&';
            }
        else if(vec[i]=='O'&&vec[i+1]=='R')
            {n++;
            i++;
            v[n]='|';
            }
        else if(vec[i]=='N'&&vec[i+1]=='O')
            {n++;
            i+=2;
            v[n]='!';
            }
        else
            {n++;
            v[n]=vec[i];
            }
int sqq;
for(i=1;i<=m;i++)
    {scanf("%c",&a);
    vc[a-'A'+1]=(!vc[a-'A'+1]);
    q=1;
    sqq=exp();
    printf("%d",sqq);
    }
return 0;
}