Cod sursa(job #2421350)

Utilizator Alex62493Manghiuc Alexandru Alex62493 Data 14 mai 2019 20:18:32
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.49 kb
#include <iostream>
#include <cstdio>

using namespace std;

FILE *fin=fopen("bool.in", "r");
FILE *fout=fopen("bool.out", "w");

char ecc[1002], sw[102], ec[1002];
int n, sww[27];

int Paranteza(int poz)
{
    char sf=poz==0 ? '\n' : ')';
    int x;
    if (ec[poz]=='1' || ec[poz]=='0')
        x=ec[poz]-'0';
    else if (ec[poz]>='A' && ec[poz]<='Z')
        x=sww[ec[poz]-'A'];
    else if (ec[poz]=='!')
    {
        if (ec[poz+1]=='1' || ec[poz+1]=='0')
        {
            x=ec[poz+1]-'0';
            poz++;
        }
        else if (ec[poz+1]>='A' && ec[poz+1]<='Z')
        {
            x=sww[ec[poz+1]-'A'];
            poz++;
        }
        else if (ec[poz+1]=='(')
        {
            x=Paranteza(poz+2);
            int par=1;
            poz+=2;
            while (par)
            {
                if (ec[poz]=='(')
                    par++;
                if (ec[poz]==')')
                    par--;
                poz++;
            }
            poz--;
        }
        x=(x+1)%2;
    }
    else if (ec[poz]=='(')
    {
        x=Paranteza(poz+1);
        int par=1;
        poz++;
        while (par)
        {
            if (ec[poz]=='(')
                par++;
            if (ec[poz]==')')
                par--;
            poz++;
        }
        poz--;
    }
    poz++;
    while (ec[poz]!=sf)
    {
        char semn=ec[poz];
        poz++;
        int y;
        if (ec[poz]=='1' || ec[poz]=='0')
            y=ec[poz]-'0';
        else if (ec[poz]>='A' && ec[poz]<='Z')
            y=sww[ec[poz]-'A'];
        else if (ec[poz]=='!')
        {
            if (ec[poz+1]=='1' || ec[poz+1]=='0')
            {
                y=ec[poz+1]-'0';
                poz++;
            }
            else if (ec[poz+1]>='A' && ec[poz+1]<='Z')
            {
                y=sww[ec[poz+1]-'A'];
                poz++;
            }
            else if (ec[poz+1]=='(')
            {
                y=Paranteza(poz+2);
                int par=1;
                poz+=2;
                while (par)
                {
                    if (ec[poz]=='(')
                        par++;
                    if (ec[poz]==')')
                        par--;
                    poz++;
                }
                poz--;
            }
            y=(y+1)%2;
        }
        else if (ec[poz]=='(')
        {
            y=Paranteza(poz+1);
            int par=1;
            poz++;
            while (par)
            {
                if (ec[poz]=='(')
                    par++;
                if (ec[poz]==')')
                    par--;
                poz++;
            }
            poz--;
        }
        poz++;
        if (semn=='|')
        {
            x=x|y;
        }
        else
        {
            x=x&y;
        }
    }
    return x;
}

int main()
{
    fgets(ecc, 1001, fin);
    fscanf(fin, "%d", &n);
    fgetc(fin);
    fgets(sw, n+1, fin);
    int z=0, l=0;
    while (ecc[z]!='\n')
    {
        bool kk=true;
        if (ecc[z]=='T')
        {
            if (ecc[z+1]=='R')
            {
                z=z+4;
                ec[l]='1';
                l++;
                kk=false;
            }
        }
        if (ecc[z]=='F' && kk)
        {
            if (ecc[z+1]=='A')
            {
                z=z+5;
                ec[l]='0';
                l++;
                kk=false;
            }
        }
        if (ecc[z]==' ' && kk)
        {
            z++;
            kk=false;
        }
        if (ecc[z]=='A' && kk)
        {
            if (ecc[z+1]=='N')
            {
                z=z+3;
                ec[l]='&';
                l++;
                kk=false;
            }
        }
        if (ecc[z]=='O' && kk)
        {
            if (ecc[z+1]=='R')
            {
                z=z+2;
                ec[l]='|';
                l++;
                kk=false;
            }
        }
        if (ecc[z]=='N' && kk)
        {
            if (ecc[z+1]=='O')
            {
                z=z+3;
                ec[l]='!';
                l++;
                kk=false;
            }
        }
        if (kk)
        {
            ec[l]=ecc[z];
            l++;
            z++;
        }
    }
    ec[l]='\n';
    z=0;
    while (n)
    {
        n--;
        sww[sw[z]-'A']=(sww[sw[z]-'A']+1)&1;
        fprintf(fout, "%d", Paranteza(0));
        z++;
    }
    return 0;
}