Cod sursa(job #1741154)

Utilizator hanganflorinHangan Florin hanganflorin Data 13 august 2016 01:59:00
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.29 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

ifstream is("bool.in");
ofstream os("bool.out");

struct Nod{
    string sign;
    Nod* left;
    Nod* right;
};

int n, poz;
bool var[26]; // variabilele
string s = "";
Nod* p;
const string signs[] = {"OR", "AND", "NOT", "TRUE", "FALSE"};
void Expresie(string s, Nod* p);
void RemoveSpaces(string& s);
bool RemoveBrackets(string& s);
int FindSign(string s, string sign); // returneaza pozitia primului semn care nu e in paranteza
bool Calculeaza(Nod*p);

int main()
{
    getline(is, s);
    RemoveSpaces(s);
    p = new Nod;
    Expresie(s, p);
    is >> n;
    is >> s;
    for ( int i = 0; i < n; ++i )
    {
        var[s[i]-65] = !var[s[i]-65];
        os << Calculeaza(p);
    }
    is.close();
    os.close();
    return 0;
}
void Expresie(string s, Nod* p)
{
    string lstring, rstring;
    while ( RemoveBrackets(s) ) ;
    poz = FindSign(s, "OR");
    p->left = new Nod;
    p->right = new Nod;
    if ( poz != -1 )
    {
        p->sign = "OR";
        lstring = s.substr(0, poz);
        rstring = s.substr(poz+2, s.size()-poz-2);
        Expresie(lstring, p->left);
        Expresie(rstring, p->right);
        return;
    }
    poz = FindSign(s, "AND");
    if ( poz != -1 )
    {
        p->sign = "AND";
        lstring = s.substr(0, poz);
        rstring = s.substr(poz+3, s.size()-poz-3);
        Expresie(lstring, p->left);
        Expresie(rstring, p->right);
        return;
    }
    poz = FindSign(s, "NOT");
    if ( poz != -1 )
    {
        p->sign = "NOT";
        rstring = s.substr(poz+3, s.size()-poz-3);
        p->left = 0;
        Expresie(rstring, p->right);
        return;
    }
    poz = FindSign(s, "TRUE");
    if ( poz != -1 )
    {
        p->sign = "TRUE";
        p->left = 0;
        p->right = 0;
        return;
    }
    //e litera
    p->sign = s;
    p->left = 0;
    p->right = 0;

}
void RemoveSpaces(string& s)
{
    for (int i = 0; i < s.size(); ++i )
        if ( s[i] == ' ' )
        {
            s.erase(i, 1);
            i++;
        }
}
bool RemoveBrackets(string& s)
{
    int brack = 0;
    if ( s[0] != '(' || s[s.size()-1] != ')' )
        return false;
    for ( int i = 0; i < s.size()-1; ++i )
    {
        if ( s[i] == '(' )
            brack++;
        if ( s[i] == ')' )
            brack--;
        if ( brack == 0 )
            return false;
    }
    s.erase(0, 1);
    s.erase(s.size()-1, 1);
    return true;
}
int FindSign(string s, string sign)
{
    int brack = 0;
    int aux = s.size()-sign.size();
    for ( int i = 0; i <= aux;++i ) //WTF
    {
        if ( s[i] == '(' )
            brack++;
        if ( s[i] == ')' )
            brack--;
        if ( brack == 0 && sign.compare(s.substr(i, sign.size())) == 0 )
            return i;
    }
    return -1;
}
bool Calculeaza(Nod*p)
{
    if ( p->sign == "AND" )
        return Calculeaza(p->left) && Calculeaza(p->right);
    if ( p->sign == "OR" )
        return Calculeaza(p->left) || Calculeaza(p->right);
    if ( p->sign == "NOT" )
        return !Calculeaza(p->right);
    if ( p->sign == "TRUE" )
        return true;
    if ( p->sign == "FALSE" )
        return false;
    return var[p->sign[0]-65];
}