Cod sursa(job #1845722)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 11 ianuarie 2017 20:32:32
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

string sir;
int k;
bool v[26];

int expresie();
int factor();
int termen();

int expresie()
{
    int val=termen();
    while(sir[k]=='|')
        ++k,val|=termen();
    return val;
}

int termen()
{
    int val=factor();
    while(sir[k]=='&')
        ++k,val&=factor();
    return val;
}

int factor()
{
    int val=0;
    if(sir[k] == '!')
    {
        ++k;
        return !factor();
    }
    if(sir[k] == '(')
    {
        ++k;
        val=expresie();
        ++k;
        return val;
    }
    if(sir[k] == '1')
    {
        ++k;
        return 1;
    }
    if(sir[k] == '0')
    {
        ++k;
        return 0;
    }++k;
    return v[sir[k-1] - 'A'];
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    getline(cin,sir);
    int n,l=sir.length();
    char c;
    scanf("%d ",&n);
    for(int i=0; i<=sir.size(); i++)
        if(sir[i]=='N' && sir[i+1]=='O' && sir[i+2]=='T')
            sir[i]='!',sir.erase(i+1,2);
        else if(sir[i]=='O' && sir[i+1]=='R')
            sir[i]='|',sir.erase(i+1,1);
        else if(sir[i]=='A' && sir[i+1]=='N' && sir[i+2]=='D')
            sir[i]='&',sir.erase(i+1,2);
        else if(sir[i]==' ')
            sir.erase(i,1),i--;
        else if(sir[i]=='T' && sir[i+1]=='R')
            sir[i]='1',sir.erase(i+1,3);
        else if(sir[i]=='F' && sir[i+1]=='A')
            sir[i]='0',sir.erase(i+1,4);
    //  cout<<sir;

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

    return 0;
}