Cod sursa(job #2852792)

Utilizator KarinAAndrei Karina KarinA Data 19 februarie 2022 16:14:30
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;

ifstream in ("bool.in");
ofstream out ("bool.out");

int n,m,lg;
int val[30],a[1005];
char v[1005],s[105];
stack <int> st;
int Next[1005];
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;

void read()
{
    in.getline(v,1005);
    n=strlen(v);
    in>>m;
    in>>s;
}

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

int solve(int st,int dr)
{
    int b[1005],c[1005],k=0,lung=0;
    for(int i=st;i<=dr;i++)
    {
        if(a[i]>=0 && a[i]<=26)
                b[++k]=val[a[i]];
        if(a[i]==NOT)
        {
            if(a[i+1]>=0 && a[i+1]<=26)
                b[++k]=!val[a[i+1]];
            else if(a[i+1]==P1)
            {
                b[++k]=!solve(i+2,Next[i+1]);
                i=Next[i+1];
            }
        }
        else if(a[i]==P1)
        {
            b[++k]=solve(i+1,Next[i]);
            i=Next[i];
        }
        else if(a[i]==TRUE) b[++k]=1;
        else if(a[i]==FALSE) b[++k]=0;
        else if(a[i]!=P2) b[++k]=a[i];
    }
   for(int i=1;i<=k;i++)
    {
        if(b[i]==0 || b[i]==1)
            c[++lung]=b[i];
        else if(b[i]==AND)
            c[lung]=c[lung]&b[i+1];
        else c[++lung]=b[i];
    }
    int x=c[1];
    for(int i=1;i<=lung;i++)
    {
        if(c[i]==OR)
            x=x|c[i+1];
    }
    return x;
}

int main()
{
    read();
    precalc();
    for(int i=0;i<m;i++)
    {
        val[s[i]-'A']=!val[s[i]-'A'];
        out<<solve(1,lg);
    }
    return 0;
}