Cod sursa(job #2428655)

Utilizator LorinBudacaLorin Budaca LorinBudaca Data 5 iunie 2019 23:19:14
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");

char s[1003];
bool v[27];
int jump(int indice)
{
    int nr_ec_in_rama=0;
    for (int i=indice+1;true;i++)
    {
        if (s[i]=='(')
            nr_ec_in_rama++;
        if (s[i]==')')
            nr_ec_in_rama--;
        if (nr_ec_in_rama<0)
            return i;
    }
}
void influentare(bool &raspuns,bool informatie,bool cerinta,bool &negare)
{
    if (negare==1)
    {
        negare=0;
        if (cerinta==0)
            raspuns=raspuns||!informatie;
        else
            raspuns=raspuns&&!informatie;
        return;
    }
    if (cerinta==0)
            raspuns=raspuns||informatie;
        else
            raspuns=raspuns&&informatie;
    return;

}

bool ecuatie(int indice)
{
    bool raspuns=false;
    bool cerinta=false; // false - || , true - &&
    bool negare=false;
    int nr_ec_in_rama=0;
    int i=indice;
    while (nr_ec_in_rama>=0)
    {
        if (s[i]<='Z'&&s[i]>='A'&&(s[i+1]>'Z'||s[i+1]<'A')) // e o variabila
        {
            influentare(raspuns,v[s[i]-'A'],cerinta,negare);
        }
        if (s[i]=='(')
        {
            nr_ec_in_rama++;
            bool c=ecuatie(i+1);
            influentare(raspuns,c,cerinta,negare);
            i=jump(i);
        }
        if (s[i]==')')
            nr_ec_in_rama--;
        if (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
        {
            cerinta=true;
            i+=2;
        }
        if (s[i]=='O'&&s[i+1]=='R')
        {
            cerinta=false;
            i+=1;
        }
        if (s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
        {
            i+=2;
            negare=1;
        }
        if (s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S')
        {
            influentare(raspuns,false,cerinta,negare);
            i+=4;
        }
        if (s[i]=='T'&&s[i+1]=='R')
        {
            influentare(raspuns,true,cerinta,negare);
            i+=3;
        }
        i++;
    }
    return raspuns;
}
int main()
{
    fin.getline(s,1001);
    int l=strlen(s);
    s[l]=')';
    s[l+1]=NULL;
    int n;
    //cout << s << "\n";
    fin >> n;
    for (int i=1;i<=n;i++)
    {
        char x;
        fin >> x;
        v[x-'A']=!v[x-'A'];
        fout << ecuatie(0);
    }
    return 0;
}