Cod sursa(job #2540116)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 6 februarie 2020 19:15:12
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <cstdio>
#include <string>
#include <iostream>
#include <cctype>
using namespace std;
const int LMAX = 1000;
int fp[LMAX + 5] , op[LMAX + 5] ,  v[35];
string s;
int forma_poloneza()
{
    int i, top1, top2 , j;
    string op_logic;
    top1 = top2 = 0;
    for(i = 0 ; i < s.length() ; i ++)
    {
        if(isalpha(s[i]))
            op_logic.push_back(s[i]);
        if((i > 0 && !isalpha(s[i]) && isalpha(s[i - 1])) || (i == s.length() - 1 && isalpha(s[i])))
        {
            if(op_logic.length() == 1)
            {
                fp[++ top1] = v[op_logic[0] - 'A' + 1];
                while(top2 > 0 && op[top2] == 1)
                {
                    fp[top1] = !fp[top1];
                    top2 --;
                }
            }
            else
            {
                if(op_logic == "NOT")
                    op[++ top2] = 1;
                else if(op_logic == "AND")
                    op[++ top2] = 2;
                else if(op_logic == "OR")
                    op[++ top2] = 3;
                else if(op_logic == "TRUE")
                    fp[++ top1] = 1;
                else if(op_logic == "FALSE")
                    fp[++ top1] = 0;
                while(top2 > 0 && op[top2] == op[top2 - 1] && op[top2] != 4)
                {
                    if(op[top2] == 2)
                        fp[top1 - 1] = (fp[top1 - 1] & fp[top1]);
                    else
                        fp[top1 - 1] = (fp[top1 - 1] | fp[top1]);
                    top1 --;
                    top2 --;
                }
            }
            op_logic.clear();
        }
        if(s[i] == '(')
            op[++ top2] = 4;
        else if(s[i] == ')')
        {
            while(top2 > 0 && op[top2] != 4)
            {
                if(op[top2] == 2)
                    fp[top1 - 1] = (fp[top1 - 1] & fp[top1]);
                else
                    fp[top1 - 1] = (fp[top1 - 1] | fp[top1]);
                top1 --;
                top2 --;
            }
            top2 --;
            while(top2 > 0 && op[top2] == 1)
            {
                fp[top1] = !fp[top1];
                top2 --;
            }
        }
    }
    while(top2 > 0)
    {
        if(op[top2] == 2)
            fp[top1 - 1] = (fp[top1 - 1] & fp[top1]);
        else
            fp[top1 - 1] = (fp[top1 - 1] | fp[top1]);
        top1 --;
        top2 --;
    }
    return fp[1];
}
int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    int n, i , j;
    char ch;
    getline(cin, s);
    scanf("%d\n", &n);
    for(i = 1 ; i <= n ; i ++)
    {
        scanf("%c", &ch);
        v[ch - 'A' + 1] = !v[ch - 'A' + 1];
        printf("%d", forma_poloneza());
    }
    return 0;
}