Cod sursa(job #2017202)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 31 august 2017 15:22:24
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.93 kb
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <stack>
#include <vector>

using namespace std;

FILE *in,*out;

const int nmax = 1000;

char c[nmax+3];

map <string,bool> m;

struct Symbol
{
    int tip;
    string semn;
    string val;
    int prio;
} v[1+nmax];

int n;

void parsare()
{
    int i = 0;
    while(c[i] != '\0')
    {
        int iplus = 1;
        if('A' <= c[i] && c[i] <= 'Z' && (c[i+1] < 'A' || c[i+1] > 'Z'))
        {
            v[++n].tip = 4;
            v[n].val = string(1,c[i]);
            m[v[n].val] = 0;
        }
        if(c[i] == '(')
            v[++n].tip = 1;
        if(c[i] == ')')
            v[++n].tip = 2;
        if(c[i] == 'N' && c[i+1] == 'O' && c[i+2] == 'T')
        {
            v[++n].tip = 4;
            v[n].val = "TRUE";
            v[++n].tip = 3;
            v[n].semn = "NOT";
            v[n].prio = 3;
            iplus = 3;
        }
        if(c[i] == 'A' && c[i+1] == 'N' && c[i+2] == 'D')
        {
            v[++n].tip = 3;
            v[n].semn = "AND";
            v[n].prio = 2;
            iplus = 3;
        }
        if(c[i] == 'O' && c[i+1] == 'R')
        {
            v[++n].tip = 3;
            v[n].semn = "OR";
            v[n].prio = 1;
            iplus = 2;
        }
        if(c[i] == 'T' && c[i+1] == 'R')
        {
            v[++n].tip = 4;
            v[n].val = "TRUE";
            iplus = 4;
        }
        if(c[i] == 'F' && c[i+1] == 'A')
        {
            v[++n].tip = 4;
            v[n].val = "FALSE";
            iplus = 5;
        }
        i += iplus;
    }
    m["TRUE"] = 1;
    m["FALSE"] = 0;

}

vector <int> output;
stack <int> opst;

void converttopostfix()
{
    for(int i = 1; i <= n; i ++)
    {
        if(v[i].tip == 3)
        {
            while(0 < opst.size() && v[opst.top()].prio >= v[i].prio)
            {
                output.push_back(opst.top());
                opst.pop();
            }
            opst.push(i);
        }
        if(v[i].tip == 1)
            opst.push(i);
        if(v[i].tip == 2)
        {
            while(v[opst.top()].tip != 1)
            {
                output.push_back(opst.top());
                opst.pop();
            }
            opst.pop();
        }
        if(v[i].tip == 4)
            output.push_back(i);
    }
    while(opst.size() > 0)
    {
        output.push_back(opst.top());
        opst.pop();
    }

}

bool calculate()
{
    if(output.size() == 1)
        return output[0];
    else
    {
        int neval = 2;
        bool eval[1+nmax];
        eval[1] = m[v[output[0]].val];
        eval[2] = m[v[output[1]].val];
        for(int i = 2; i < output.size(); i ++)
        {
            if(v[output[i]].tip == 3)
            {
                if(v[output[i]].semn == "NOT")
                {
                    eval[neval-1] = 1 - eval[neval];
                    neval --;
                }
                if(v[output[i]].semn == "AND")
                {
                    eval[neval-1] = (eval[neval] && eval[neval-1]);
                    neval --;
                }
                if(v[output[i]].semn == "OR")
                {
                    eval[neval-1] = (eval[neval] || eval[neval-1]);
                    neval --;
                }
            }
            if(v[output[i]].tip == 4)
            {
                eval[++neval] = m[v[output[i]].val];
            }
        }
        return eval[1];
    }
}

const int nrmax = 100;
char k[nrmax+3];

int main()
{
    in = fopen("bool.in","r");
    out = fopen("bool.out","w");
    fgets(c,nmax+3,in);
    parsare();
    converttopostfix();
    int t;
    fscanf(in,"%d\n",&t);
    fgets(k,nrmax+3,in);
    for(int i = 0; i < t; i ++)
    {
        m[string(1,k[i])] = 1 - m[string(1,k[i])];
        fprintf(out,"%d",calculate());
    }
    return 0;
}