Cod sursa(job #2428674)

Utilizator LorinBudacaLorin Budaca LorinBudaca Data 6 iunie 2019 00:34:52
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.32 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");

char s[2003];
bool v[27];
void strcp(char a[2003],char b[2003])
{
    int i;
    char aux[2003];
    for (i=0; i<strlen(b); i++)
        aux[i]=b[i];
    aux[i]=NULL;
    for (i=0; i<strlen(aux); i++)
        a[i]=aux[i];

    a[i]=NULL;
}
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;
    }
}
int b_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);
        }
        else if (s[i]=='(')
        {
            bool c=ecuatie(i+1);
            influentare(raspuns,c,cerinta,negare);
            i=jump(i);
        }
        else if (s[i]==')')
            nr_ec_in_rama--;
        if (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
        {
            cerinta=true;
            i+=2;
        }
        else if (s[i]=='O'&&s[i+1]=='R')
        {
            cerinta=false;
            i+=1;
        }
        else if (s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
        {
            i+=2;
            negare=1;
        }
        else if (s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S')
        {
            influentare(raspuns,false,cerinta,negare);
            i+=4;
        }
        else 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;
    strcp(s+1,s);
    s[0]='(';
    //cout << s <<"\n";
    for (int i=0; i<strlen(s); i++)
    {
        if (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
        {
            int inainte=i-1;
            int dupa=i+3;
            for (int j=dupa; j<=strlen(s); j++)
            {
                if (s[j]=='(')
                {
                    j=jump(j);
                    strcp(s+j+1,s+j);

                    break;
                }
                if (s[j]<='Z'&&s[j]>='A'&&(s[j+1]>'Z'||s[j+1]<'A')&&(s[j-1]>'Z'||s[j-1]<'A')) // e o variabila
                {
                    strcp(s+j+1,s+j);
                    s[j+1]=')';
                    break;
                }
                if (s[j]=='F'&&s[j+1]=='A'&&s[j+2]=='L'&&s[j+3]=='S')
                {
                    j+=4;
                    strcp(s+j+1,s+j);
                    s[j+1]=')';
                    break;
                }
                if (s[j]=='T'&&s[j+1]=='R')
                {
                    j+=3;
                    strcp(s+j+1,s+j);
                    s[j+1]=')';
                    break;
                }
            }
            //cout << s << "\n";
            for (int j=inainte; j>=0; j--)
            {
                if (s[j]==')')
                {
                    j=b_jump(j);
                    //cout << j <<endl;
                    if (s[j-2]=='T'&&s[j-3]=='O')
                        j-=4;
                    strcp(s+j+1,s+j);
                    s[j]='(';
                    break;
                }
                if (s[j]<='Z'&&s[j]>='A'&&(s[j+1]>'Z'||s[j+1]<'A')&&(s[j-1]>'Z'||s[j-1]<'A')) // e o variabila
                {
                    if (s[j-2]=='T'&&s[j-3]=='O')
                        j-=4;
                    strcp(s+j+1,s+j);
                    s[j]='(';
                    break;
                }
                if (s[j]=='F'&&s[j+1]=='A'&&s[j+2]=='L'&&s[j+3]=='S')
                {
                    if (s[j-2]=='T'&&s[j-3]=='O')
                        j-=4;
                    strcp(s+j+1,s+j);
                    s[j]='(';
                    break;
                }
                if (s[j]=='T'&&s[j+1]=='R')
                {
                    if (s[j-2]=='T'&&s[j-3]=='O')
                        j-=4;
                    strcp(s+j+1,s+j);
                    s[j]='(';
                    break;
                }
            }
            i+=3;

        }
    }
    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(1);
    }
    return 0;
}