Cod sursa(job #1308255)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 3 ianuarie 2015 20:22:58
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int c[27];
char e[1002],e2[102];
int i,n,lg;
inline bool eMare(char c)
{
    if((c>='A')&&(c<='Z'))  return 1;
    return 0;
}
inline bool eAnd()
{
    if(e[i]=='A'&&e[i+1]=='N')return 1;
    return 0;
}
inline bool eOr()
{
    if(e[i]=='O'&&e[i+1]=='R')return 1;
    return 0;
}
inline bool eNot()
{
    if(e[i]=='N'&&e[i+1]=='O')return 1;
    return 0;
}
inline bool eTrue()
{
    if(e[i]=='T'&&e[i+1]=='R')return 1;
    return 0;
}
inline bool eFalse()
{
    if(e[i]=='F'&&e[i+1]=='A')return 1;
    return 0;
}
bool evalExp1();
bool evalExp2();
bool evalExp3();
bool evalExp1()
{
    bool r=evalExp2();
    while(eOr())
    {
        i=i+3;
        r|=evalExp2();
    }
    return r;
}
bool evalExp2()
{
    bool r=evalExp3();
    while(eAnd())
    {
        i=i+4;
        r&=evalExp3();
    }
    return r;
 
}
bool evalExp3()
{
    bool r;
    if(e[i]=='(')
    {
        i++;
        r=evalExp1();
        i++;
    }
    else if(eMare(e[i]))
    {
            if(eNot())
            {
                i=i+4;
                r= !(evalExp3());
            }
            else if(eTrue())
                {   i=i+5;
                    return 1;
                }
            else if(eFalse())
            {
                i=i+6;
                return 0;
            }
             else
           {
               r=c[e[i]-'A'];
               i=i+2;
           }
    }
             return r;
}
int main()
{
    int q;
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    fgets(e,1002,stdin);
    scanf("%d",&n);
    scanf("%s",e2);
    for(q=0;q<n;q++)
    {
        i=0;
        c[e2[q]-'A']=!(c[e2[q]-'A']);
       printf("%d",evalExp1());
    }
 
}