Cod sursa(job #60629)

Utilizator DastasIonescu Vlad Dastas Data 15 mai 2007 18:21:50
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.28 kb
#include <cstdio>
#include <cstring>

#define maxL 1001
#define maxN 101
#define alfa 27

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

char e[maxL];
int alf[alfa] = {0};
char var[maxN];
int n;
char RPN[maxL];

int l;

void read()
{
    fgets(e, maxL, in);

    fscanf(in, "%d\n", &n);
    for ( int i = 0; i < n; ++i )
        fscanf(in, "%c", &var[i]);

    l = strlen(e) - 1;
    e[l] = '\0';
}

void norm()
{
    char t[maxL];
    int k = 0;

    for ( int i = 0; i < l; ++i )
        if ( e[i] == 'A' && e[i+1] == 'N' )
            t[k++] = '&', i += 2;
        else if ( e[i] == 'O' && e[i+1] == 'R' )
            t[k++] = '|', i += 2;
        else if ( e[i] == 'N' && e[i+1] == 'O' )
            t[k++] = '~', i += 2;
        else if ( e[i] == 'T' && e[i+1] == 'R' )
            t[k++] = '1', i += 3;
        else if ( e[i] == 'F' && e[i+1] == 'A' )
            t[k++] = '0', i += 4;
        else if ( e[i] != ' ' )
            t[k++] = e[i];

    t[k] = '\0';
    strcpy(e, t);
    l = strlen(e);
}

int isalpha(char c)
{
    return (c <= 'Z' && c >= 'A') || c == '1' || c == '0';
}

void conv()
{
    char st[maxL];
    int r = -1;
    int k = -1;

    for ( int i = 0; i < l; i++ )
    {
        if ( isalpha(e[i]) )
        {
            ++r;
            RPN[r] = e[i];
        }
        else if ( e[i] == '&' || e[i] == '|' )
        {
            while ( (st[k] == '&' || st[k] == '|' || st[k] == '~') && k >= 0  )
            {
                ++r;
                RPN[r] = st[k];
                --k;
            }
            ++k;
            st[k] = e[i];
        }
        else if ( e[i] == '~' )
        {
            while ( st[k] == '~' && k >= 0 )
            {
                ++r;
                RPN[r] = st[k];
                --k;
            }
            ++k;
            st[k] = e[i];
        }
        else if ( e[i] == '(' )
        {
            ++k;
            st[k] = '(';
        }
        else
        {
            while ( st[k] != '(' && k >= 0 )
            {
                ++r;
                RPN[r] = st[k];
                --k;
            }
            --k;
        }
    }
    while ( k >= 0 )
    {
        ++r;
        RPN[r] = st[k];
        --k;
    }

//    printf("%s", RPN);
}

int eval()
{
    int st[maxL];
    int k = -1;

    for ( int i = 0; i < l; ++i )
    {
        if ( isalpha(RPN[i]) )
            st[++k] = RPN[i];
        else if ( RPN[i] == '|' )
        {
            st[k-1] = (alf[st[k]-'A'] == 1 || alf[st[k-1]-'A'] == 1)?'1':'0';
            --k;
        }
        else if ( RPN[i] == '&' )
        {
            st[k-1] = (alf[st[k]-'A'] == 0 || alf[st[k-1]-'A'] == 0)?'0':'1';
            --k;
        }
        else
        {
            st[k] = (alf[st[k]-'A']==1)?0:1;
        }
    }
    return st[0];
}

int main()
{
    read();
    norm();
//    puts(e);
    conv();
//    printf("\n");

//    printf("%d\n", eval());
//    printf("%s", var);

    for ( int i = 0; i < n; ++i )
    {
        if ( alf[var[i]-'A'] == 1 )
            alf[var[i]-'A'] = 0;
        else

            alf[var[i]-'A'] = 1;
        fprintf(out, "%c", eval()==1?'1':'0');
    }
    fprintf(out, "\n");

	return 0;
}