Cod sursa(job #1874931)

Utilizator Gigel-FroneGigel Fronel Gigel-Frone Data 10 februarie 2017 16:17:53
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <string>
#include <iostream>

using namespace std;

bool v[30];
string s;
int k;

bool f1(), f2(), f3();

bool f1()
{
    int x=f2();
    while(s[k]=='|')
    {
        k++;
        x|=f2();
    }
    return x;
}

bool f2()
{
    int x=f3();
    while(s[k]=='&')
    {
        k++;
        x&=f3();
    }
    return x;
}

bool f3()
{
    bool x=0;
    if(s[k] == '!')
    {
        k++;
        return !f3();
    }
    if(s[k] == '(')
    {
        k++;
        x=f1();
        k++;
        return x;
    }
    if(s[k] == '1')
    {
        k++;
        return 1;
    }
    if(s[k] == '0')
    {
        k++;
        return 0;
    }
    return v[s[k] - 'A'];
}

void modify()
{
    for(int i=0; i<=s.size(); i++)
    {
        if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            s[i]='!';
            s.erase(i+1, 2);
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            s[i]='|';
            s.erase(i+1, 1);
        }
        else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            s[i]='&';
            s.erase(i+1, 2);
        }
        else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
        {
            s[i]='1';
            s.erase(i+1, 3);
        }
        else if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
        {
            s[i]='0';
            s.erase(i+1, 4);
        }
        else if(s[i]==' ')
        {
            s.erase(i, 1);
            i--;
        }
    }
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);

    getline(cin, s);
    modify();
    int n;
    scanf("%d ", &n);
    char c;

    for(int i=1; i<=n; i++)
    {
        scanf("%c", &c);
        v[c-'A']=!v[c-'A'];
        k=0;
        printf("%d", f1());
    }
}