Cod sursa(job #1825087)

Utilizator mihai2003LLL LLL mihai2003 Data 8 decembrie 2016 18:35:05
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 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 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;
}
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'];
}