Cod sursa(job #1068647)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 28 decembrie 2013 16:04:15
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream ka("bool.in");
ofstream ki("bool.out");
int k;
struct paranteza
{
    bool val;
    int lungime;
}paranteze[1005];
string s, expresie, schimbari;
bool val[30],valoare[1005];
int lungime[1005];
bool evalueaza(int inceput, int sfarsit)
{
    for(int i=inceput;i<=sfarsit;i++)
    {
        if(expresie[i]>='A'&&expresie[i]<='Z')
        {
            valoare[i]=val[expresie[i]-'A'];
            lungime[i]=1;
        }
        else if(expresie[i]==')')
        {
            for(int j=i-1;j>=inceput;j--)
            {
                if(expresie[j]=='('&&!lungime[j])
                {
                        valoare[j]=evalueaza(j+1,i-1);
                        lungime[j]=i-j+1;
                        break;
                }
            }
        }
        else
        {
            if(expresie[i]!=')'&&expresie[i]!='(')
            lungime[i]=1;
            if(expresie[i]<=1)
            valoare[i]=expresie[i];
        }
    }
    for(int i=inceput;i<=sfarsit;i++)
    {
        if(expresie[i]=='!')
        {
            valoare[i]=!valoare[i+1];
            lungime[i]=lungime[i+1]+1;
        }
    }
    for(int i=inceput;i<=sfarsit;i++)
    {
        if(expresie[i+lungime[i]]=='&')
        {
            valoare[i]=valoare[i]&&valoare[i+lungime[i]+1];
            lungime[i]=lungime[i]+1+lungime[i+lungime[i]+1];
            i--;
        }
    }
    for(int i=inceput;i<=sfarsit;i++)
    {
        if(expresie[i+lungime[i]]=='|')
        {
            valoare[i]=valoare[i]||valoare[i+lungime[i]+1];
            lungime[i]=lungime[i]+1+lungime[i+lungime[i]+1];
            i--;
        }
    }
    return valoare[inceput];
}
int main()
{
    while (ka>>s)
    {
        if ( s[0] >= '0'&& s[0] <= '9')
        break;
        if(s=="TRUE")
        expresie.push_back(1);
        else if(s=="FALSE")
        expresie.push_back(0);
        else if(s=="AND")
        expresie.push_back('&');
        else if(s=="NOT")
        expresie.push_back('!');
        else if(s=="OR")
        expresie.push_back('|');
        else
        {
            for(int i=0;i<s.size();i++)
            expresie.push_back(s[i]);
        }
    }
    for(int i=0;i<expresie.size();i++)
    {
        if(expresie[i]=='T'&&expresie[i+1]=='R')
        {
            expresie[i]=1;
            for(int j=i+1;j<=expresie.size()-4;j++)
            expresie[j]=expresie[j+3];
            expresie.erase(expresie.size()-3,3);
        }
        if(expresie[i]=='F'&&expresie[i+1]=='A')
        {
            expresie[i]=0;
            for(int j=i+1;j<=expresie.size()-5;j++)
            expresie[j]=expresie[j+4];
            for(int j=1;j<=4;j++)
            expresie.erase(expresie.size()-4,4);
        }
    }
    int nr = 0;
    for(int i=0;i<s.size();i++)
    nr=nr*10+s[i]-'0';
    char x;
    for(int i=1;i<=nr;i++)
    {
        ka>>x;
        schimbari.push_back(x);
    }
    for(int i=0;i<nr;i++)
    {
    val[schimbari[i]-'A']=!val[schimbari[i]-'A'];
    for(int j=0;j<expresie.size();j++)
    lungime[j]=0;
    ki<<evalueaza(0,expresie.size()-1);
    }
}