Cod sursa(job #938942)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 14 aprilie 2013 15:50:11
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

int n;
char s[1010], changes[105];
bool val[30];
int poz;

inline bool eval();
inline bool termen();
inline bool factor();

inline void Read()
{
    ifstream f("bool.in");
    f.getline(s+1, 1010);
    f>>n;
    f>>(changes+1);
    f.close();
}

inline bool eval()
{
    bool rez = termen(), aux;
    while (s[poz] == 'O' && s[poz+1] == 'R' && s[poz+1])
    {
        poz+=3;
        aux = termen();
        rez = rez || aux;
    }
    return rez;
}

inline bool termen()
{
    bool rez = factor(), aux;
    while (s[poz] == 'A' && s[poz+1] == 'N')
    {
        poz+=4;
        aux = factor();
        rez = rez && aux;
    }
    return rez;
}

inline bool factor()
{
    if (s[poz] == 'T' && s[poz+1] == 'R')
    {
        poz += 5;
        return true;
    }
    if (s[poz] == 'F' && s[poz+1] == 'A')
    {
        poz += 6;
        return false;
    }
    if (s[poz] >= 'A' && s[poz] <= 'Z' && !(s[poz+1] >= 'A' && s[poz+1] <= 'Z'))
    {
        bool rez = val [s[poz] - 'A' + 1];
        while (s[poz+1] == ' ')
            poz++;
        return rez;
    }
    if (s[poz] == 'N' && s[poz+1] == 'O')
    {
        poz += 4;
        return !factor();
    }
    /// daca am ajuns aici inseamna ca am paranteza
    int rez;
    poz++;
    rez = eval();
    poz++;
    while(s[poz] == ' ')
        poz++;
    return rez;
}

inline void Solve()
{
    int i;
    bool rez;
    ofstream g ("bool.out");
    for (i=1; i<=n; i++)
    {
        val[changes[i] - 'A' + 1] = !val[changes[i] - 'A' + 1];
        poz = 1;
        rez = eval();
        if (rez)
            g<<1;
        else
            g<<0;
    }
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}