Cod sursa(job #1576904)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 22 ianuarie 2016 22:37:46
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <stack>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char s[1005];
int n,a[1005],v[30],m,N,NEXT[1005];
stack <int> st;
const int NOT = -10;
const int TRUE = 100;
const int FALSE = 1000;
const int AND = -7;
const int OR = -6;
const int P1 = -1;
const int P2 = -2;

int Solve(int st, int dr)
{
    int i,x,dim,D;
    int b[1005];
    int c[1005];
    dim = 0;
    for(i = st; i <= dr; ++i)
    {
        if(a[i]>=0 && a[i]<=26) b[++dim] = v[a[i]];
        else if(a[i]==P1)
        {
            x = Solve(i+1,NEXT[i]);
            b[++dim] = x;
            i = NEXT[i];
        }
        else if(a[i]==NOT)
        {
            if(a[i+1]>=0 && a[i+1]<=26) b[++dim] = !v[a[i+1]];
            else if(a[i+1]==P1)
            {
                x = Solve(i+2,NEXT[i+1]);
                b[++dim] = !x;
                i = NEXT[i+1];
            }
        }
        else if(a[i]==TRUE) b[++dim] = 1;
        else if(a[i]==FALSE) b[++dim] = 0;
        else b[++dim] = a[i];
    }
    D = 0;
    for(i = 1; i <= dim; ++i)
    {
        if(b[i]==0 || b[i]==1) c[++D] = b[i];
        else if(b[i]==AND)
        {
            c[D] = b[i-1] & b[i+1];
            i++;
        }
        else c[++D] = b[i];
    }
    x = c[1];
    for(i = 2; i <= D; ++i)
        if(c[i]==OR) x = x|c[i+1],i++;
    return x;
}

void Build()
{
    int i;
    for(i=0; i < n ; ++i)
    {
        if(s[i]=='(') a[++N] = P1;
        else if(s[i]==')') a[++N] = P2;
        else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            a[++N] = AND;
            i+=2;
        }
        else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            a[++N] = NOT;
            i+=2;
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            a[++N] = OR;
            i++;
        }
        else if(s[i]=='T' && s[i+1]=='R')
        {
            a[++N] = TRUE;
            i+=3;
        }
        else if(s[i]=='F' && s[i+1]=='A')
        {
            a[++N] = FALSE;
            i+=4;
        }
        else if(s[i]>='A' && s[i]<='Z') a[++N] = s[i]-'A';
    }
    for(i=1;i<=N;++i)
    {
        if(a[i]==P1) st.push(i);
        else if(a[i]==P2)
        {
            NEXT[st.top()] = i;
            st.pop();
        }
    }
}

int main()
{
    char x;
    fin.getline(s,1005);
    n = strlen(s);
    Build();
    fin>>m;
    for(int i = 1; i <= m; ++i)
    {
        fin>>x;
        if(v[x-'A']==0) v[x-'A'] = 1;
        else v[x-'A'] = 0;
        fout<<Solve(1,N);
    }
    return 0;
}