Cod sursa(job #2816007)

Utilizator SuyggyuDumitriu Florin Suyggyu Data 10 decembrie 2021 20:47:33
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>

using namespace std;

int i = 0;
char s[1004];
char registre['Z'-'A'+1];

int evor();
int evand();
int evfactor();

int main()
{
    int nrmodificari = 0;
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    fin.getline(s, 1001);
    fin >> nrmodificari;
    char modificari[nrmodificari+1];
    fin.getline(modificari, nrmodificari+1);
    fin.getline(modificari, nrmodificari+1);
    for(int j = 0; j < nrmodificari; j++)
    {
        registre[modificari[j]-'A'] = 1 - registre[modificari[j]-'A'];
        i = 0;
        fout << evor();
    }
    fout << endl;
    return 0;
}

int evor()
{
    int r = evand();
    while(1) {
        if(s[i] == 'O')
        {
            if(s[i+1] == 'R')
            {
                i += 3;
                r = r || evand();
            } else
                break;
        } else
            break;
    }
    return r;
}

int evand()
{
    int r = evfactor();
    while(1) {
        if(s[i] == 'A')
        {
            if(s[i+1] == 'N')
            {
                if(s[i+2] == 'D')
                {
                    i += 4;
                    r = r && evfactor();
                }
            } else
                break;
        } else
            break;
    }
    return r;
}

int evfactor()
{   
    int negat = 0;
    if(s[i] == 'N')
    {
        if(s[i+1] == 'O')
        {
            if(s[i+2] == 'T')
            {
                i += 4;
                negat = 1;
            }
        }
    }
    int r = 0;

    if(s[i] == '(')
    {
        i++;
        r = evor();
        i++;
    }
    else if(s[i] == 'T')
    {
        if(s[i+1] == 'R')
        {
            if(s[i+2] == 'U')
            {
                if(s[i+3] == 'E')
                {
                    r = 1;
                    i += 5;
                }
            }
        }
    }
    else if(s[i] == 'F')
    {
        if(s[i+1] == 'A')
        {
            if(s[i+2] == 'L')
            {
                if(s[i+3] == 'S')
                {
                    if(s[i+4] == 'E')
                    {
                        r = 0;
                        i += 6;
                    }
                }
            }
        }
    }
    else if(s[i] >= 'A' && s[i] <= 'Z')
    {
        r = registre['A'-s[i]];
    }
    
    if(negat)
        return !r;
    else
        return r;
}