Cod sursa(job #2935292)

Utilizator suimerchantsui merchant suimerchant Data 6 noiembrie 2022 14:21:13
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;


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


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 n,k;
int v[1005];
int next[1005];
bool val[30];
char s[1005];


stack <int> st;


void build()
{
    for(int i=0; s[i]!=0; i++)
    {
        if(s[i]=='(')
        {
            v[++k]=P1;
        }
        else if(s[i]==')')
        {
            v[++k]=P2;
        }
        else if(s[i]=='O' && s[i+1]=='R')
        {
            v[++k]=OR;
            i++;
        }
        else if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
        {
            v[++k]=AND;
            i+=2;
        }
        else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
        {
            v[++k]=NOT;
            i+=2;
        }
        else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
        {
            v[++k]=TRUE;
            i+=3;
        }
        else if(s[i]>='A' && s[i]<='Z')
        {
            v[++k]=s[i]-'A';
        }
    }
    for(int i=1; i<=k; i++)
    {
        if(v[i]==P1)st.push(i);
        else if(v[i]==P2)
        {
            next[st.top()]=i;
            st.pop();
        }
    }
}


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


void read()
{
    fin.getline(s,1005);
    fin>>n;
    char ch;
    build();
    for(int i=1; i<=n; i++)
    {
        fin>>ch;
        val[ch-'A'] = !val[ch-'A'];
        fout<<solve(1,n);
    }
}


int main()
{
    read();
    return 0;
}