Cod sursa(job #2816002)

Utilizator SuyggyuDumitriu Florin Suyggyu Data 10 decembrie 2021 20:38:45
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 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 i = 0; i < nrmodificari; i++)
    {
        registre[modificari[i]-'A'] = 1 - registre[modificari[i]-'A'];
        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] >= 'A' && s[i] <= 'Z')
    {
        r = registre['A'-s[i]];
    }
    
    if(negat)
        return !r;
    else
        return r;
}