Cod sursa(job #1572755)

Utilizator RazvanatorHilea Razvan Razvanator Data 19 ianuarie 2016 09:01:29
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

char s[1000],aux[1000];
bool v[26];
int p;

bool expresie();
bool termen();
bool factor();

void Transforma()
{
    int n=0;
    for (int i=0;aux[i]!=0;i++) {
        if (aux[i]=='A') {
            if (aux[i+1]=='N') {i+=2;s[n++]='&';}
            else s[n++]='A';
        }
        else {
            if (aux[i]=='T') {
                if (aux[i+1]=='R') {i+=3;s[n++]='1';}
                else s[n++]='T';
            }
            else {
                if (aux[i]=='F') {
                    if (aux[i+1]=='A') {i+=4;s[n++]='0';}
                    else s[n++]='F';
                }
                else {
                    if (aux[i]=='N') {
                        if (aux[i+1]=='O') {i+=2;s[n++]='!';}
                        else s[n++]='N';
                    }
                    else {
                        if (aux[i]=='O') {
                            if (aux[i+1]=='R') {i++;s[n++]='|';}
                            else s[n++]='O';
                        }
                        else s[n++]=aux[i];
                    }
                }
            }
        }
    }
}

bool expresie()
{
    bool val=termen();
    while (s[p]=='|') {
            p++;
            val=val||termen();
    }
    return val;
}

bool termen()
{
    bool val=factor();
    while (s[p]=='&') {
        p++;
        val=val&&factor();
    }
    return val;
}

bool factor()
{
    bool val;
    if (s[p]=='!') {
        p++;
        val=factor();
        return !val;
    }
    if (s[p]=='(') {
            p++;
            val=expresie();
    }
    else if (s[p]=='0') {p++;return false;}
    else if (s[p]=='1') {p++;return true;}
    else val=v[s[p]-'A'];
    p++;
    return val;
}

int main()
{
    int n;
    char x;
    fin.get(aux,1000);
    Transforma();
    fin>>n;
    for (int i=0;i<n;i++) {
        fin>>x;
        v[x-'A']=(v[x-'A']==0?1:0);
        p=0;
        fout<<expresie();
    }
}