Cod sursa(job #844799)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 29 decembrie 2012 20:21:42
Problema Bool Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include<stdio.h>
#include<string.h>

using namespace std;

#define MAXL 2005

int N;
int st[ MAXL ], op[ MAXL ], NOT[ MAXL ], v[100];
char S[ MAXL ], A[205];

int main()
{
    FILE *f, *g;

    f = fopen("bool.in", "r");
    g = fopen("bool.out", "w");

    fgets(S, 2003, f);

    int len = strlen(S) - 1;
    if(S[len] == '\n')
        --len;
    fscanf(f, "%d", &N);

    fgets(A, 3, f);
    fgets(A, 203, f);

    for(int q = 0; q < N; ++q)
    {
        v[ A[q] - 'A' ] = !v[ A[q] - 'A' ];

        int top = 0;
        for(int i = 0; i <= len; ++i)
        {
            if(S[i] == '(')
                ++top, st[top] = -1;
            else if(S[i] == 'A' && S[i+1] == 'N')
                op[top+1] = 2, i += 2;
            else if(S[i] == 'N' && S[i+1] == 'O')
                NOT[top+1] = 1, i += 2;
            else if(S[i] == 'O' && S[i+1] == 'R')
                op[top+1] = 3, ++i;
            else if(S[i] == 'T' && S[i+1] == 'R')
                ++top, st[top] = 1;
            else if(S[i] == 'F' && S[i+1] == 'A')
                ++top, st[top] = 0;
            else if(S[i] >= 'A' && S[i] <= 'Z')
            {
                ++top, st[top] = v[ S[i] - 'A' ];
                if(NOT[top])
                    st[top] = !st[top], NOT[top] = 0;
            }
            else if(S[i] == ')')
            {
                int ii = top;
                while(st[ii] != -1)
                    --ii;

                int top2 = ii + 1;
                for(int j = ii + 2; j <= top; ++j)
                    if(op[j] == 2)
                    {
                        if(st[top2] && st[j])
                            st[top2] = 1;
                        else st[top2] = 0;
                    }
                    else ++top2, st[top2] = st[j], op[top2] = op[j];

                top = top2;
                for(int j = ii + 2; j <= top; ++j)
                {
                    if(st[ii+1] || st[j])
                        st[ii+1] = 1;
                    else st[ii+1] = 0;
                }
                st[ii] = st[ii+1];
                top = ii;
                if(NOT[top])
                    st[top] = !st[top], NOT[top] = 0;
            }
        }

        int top2 = 1;
        for(int i = 2; i <= top; ++i)
            if(op[i] == 2)
            {
                if(st[top2] && st[i])
                    st[top2] = 1;
                else st[top2] = 0;
            }
            else ++top2, st[top2] = st[i], op[top2] = op[i];
        top = top2;
        for(int i = 1; i <= top; ++i)
        {
            if(st[1] || st[i])
                st[1] = 1;
            else st[1] = 0;
        }
        if(NOT[1])
            st[1] = !st[1];

        fprintf(g, "%d", st[1]);

        memset(NOT, 0, sizeof(NOT));
        memset(st, 0, sizeof(st));
    }

    fprintf(g, "\n");

    fclose(f);
    fclose(g);

    return 0;
}