Cod sursa(job #1497873)

Utilizator antanaAntonia Boca antana Data 7 octombrie 2015 18:20:04
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char si[1001], s[1001],*c=si;
int k=-1;
void expresie()
{
    while(*c!='\n'&&*c!=NULL)
    {
        if(*c=='A'&&*(c+1)=='N'&&*(c+2)=='D')
        {
            s[++k]='&';
            ++c;
            ++c;
            ++c;
        }
        else
        {
            if(*c=='O'&&*(c+1)=='R')
            {
                s[++k]='|';
                ++c;
                ++c;
            }
            else
            {
                if(*c=='N'&&*(c+1)=='O'&&*(c+2)=='T')
                {
                    s[++k]='!';
                    ++c;
                    ++c;
                    ++c;
                }
                else
                {
                    if(*c=='T'&&*(c+1)=='R'&&*(c+2)=='U'&&*(c+3)=='E'){
                        s[++k]=1;
                        ++c;
                        ++c;
                        ++c;
                        ++c;
                    }
                    else
                    {
                        if(*c=='F'&&*(c+10)=='A'&&*(c+2)=='L'&&*(c+3)=='S'&&*(c+4)=='E'){
                            s[++k]=0;
                            ++c;
                            ++c;
                            ++c;
                            ++c;
                            ++c;
                        }
                        else
                        {
                            s[++k]=*c;
                            ++c;
                        }
                    }
                }
            }
        }
        if(*c==' ')
            ++c;
    }
}
int val[27];
int andf(char* &p);
int notf(char* &p);
int numar(char* &p);
int evaluare(char*&p)
{
    int r=andf(p);
    while(*p=='|')
    {
        ++p;
        r=(r|andf(p));
    }
    return r;
}
 int andf(char* &p)
 {
     int r=numar(p);
     while(*p=='&')
     {
         ++p;
         r=(r&numar(p));
     }
     return r;
 }
 int numar(char* &p)
 {
     int r=0;
     if(*p=='(')
     {
         ++p;
         r=evaluare(p);
         ++p;
     }else{
     if(*p==0||*p==1){
        r=*p;
        ++p;
     }else{
     if(*p>='A'&&*p<='Z'){
        r=val[*p-'A'+1];
        ++p;
     }else{
     if(*p=='!')
     {
         ++p;
         r=evaluare(p);
         if(r==1)
            r=0;
         else r=1;
     }}}}
     return r;
 }
int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    int n, i;
    char f;
    gets(si);
    expresie();
    scanf("%d\n", &n);
    for(i=1;i<=n;i++)
    {
        char *sir=s;

        scanf("%c", &f);
        if(val[f-'A'+1]==0)
            val[f-'A'+1]=1;
        else val[f-'A'+1]=0;
        printf("%d", evaluare(sir));
    }
    return 0;
}