Cod sursa(job #682475)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 19 februarie 2012 00:27:28
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <cstdio>
#include <cstring>

#define MAX 1050

using namespace std;

char sir[MAX], cit[MAX], v[MAX], *p;
int val[40], trans;

void citire()
{
    freopen("bool.in", "r", stdin);
    gets(cit);
    scanf("%d\n", &trans);
    gets(v);
    fclose(stdin);
}

bool AND(int i)
{
    return cit[i] == 'A' && cit[i + 1] == 'N' && cit[i + 2] =='D';
}

bool OR(int i)
{
    return cit[i] == 'O' && cit[i + 1] == 'R';
}

bool NOT(int i)
{
    return cit[i] == 'N' && cit[i + 1] == 'O' && cit[i + 2] == 'T';
}

bool TRUE(int i)
{
    return cit[i] == 'T' && cit[i + 1] == 'R' && cit[i + 2] == 'U' && cit[i + 3] == 'E';
}

bool FALSE(int i)
{
    return cit[i] == 'F' && cit[i + 1] == 'A' && cit[i + 2] == 'L' && cit[i + 3] == 'S' && cit[i + 4] == 'E';
}

bool litera(int i)
{
    return cit[i] >= 'A' && cit[i] <= 'Z';
}

void formSir()
{
    int i, poz = 0;
    for(i = 0; i < strlen(cit); i++)
    {
        if(AND(i))
        {
            sir[poz++] = '&';
            i += 2;
        }
        else if(OR(i))
        {
            sir[poz++] = '|';
            i++;
        }
        else if(NOT(i))
        {
            sir[poz++] = '~';
            i += 2;
        }
        else if(TRUE(i))
        {
            sir[poz++] = '1';
            i += 3;
        }
        else if(FALSE(i))
        {
            sir[poz++] = '0';
            i += 4;
        }
        else if(cit[i] != ' ')
        {
            sir[poz++] = cit[i];
        }
    }
    sir[poz] = '\n';
}

int factor();
int termen();

int evaluare()
{
    int f = factor();
    while(*p == '|')
    {
        p++;
        f |= factor();
    }
    return f;
}

int factor()
{
    int t = termen();
    while(*p == '&')
    {
        p++;
        t &= termen();
    }
    return t;
}

int termen()
{
    int t = 0;
    switch(*p)
    {
    case '(':
        p++;
        t = evaluare();
        p++;
        break;
    case '1':
        p++;
        t = 1;
        break;
    case '0':
        p++;
        t = 0;
        break;
    case '~':
        p++;
        t = !termen();
        break;
    default:
        t = val[*p - 'A'];
        p++;
        break;
    }
    return t;
}

void afisare()
{
    freopen("bool.out", "w", stdout);
    int i;
    for(i = 0; i < trans; i++)
    {
        p = sir;
        val[v[i] - 'A'] ^= 1;
        printf("%d", evaluare());
    }
    fclose(stdout);
}

int main()
{
    citire();
    formSir();
    afisare();
    return 0;
}