Cod sursa(job #2643246)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 19 august 2020 12:08:19
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda prbd1 Marime 4.17 kb
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace std;
using namespace __gnu_pbds;
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ifstream fin("bool.in");
ofstream fout("bool.out");
char v[10001],c;
int n;
int val[10001],lg,stiva[10001],operatii[10001],nt[10001];
int rez()
{
    //AND-1,OR-2
    int nivel=1;
    for(int i=0;i<lg;i++)
    {
        stiva[i]=0;
        operatii[i]=0;
        nt[i]=0;
    }
    for(int i=0;i<lg;i++)
    {
        if(v[i]==' ')
            continue;
        if(isupper(v[i])&&(v[i+1]==' '||v[i+1]==')'))
        {
            int nr=val[v[i]];
            if(nt[nivel])
            {
                if(nr==0)
                    nr=1;
                else
                    nr=0;
                nt[nivel]=0;
            }
            if(operatii[nivel]==0)
                stiva[nivel]=nr;
            else
            {
                if(operatii[nivel]==1)
                    stiva[nivel]=stiva[nivel]&nr;
                else if(operatii[nivel]==2)
                    stiva[nivel]=stiva[nivel]|nr;
                operatii[nivel]=0;
            }
            continue;
        }
        if(v[i]=='A'&&v[i+1]=='N'&&v[i+2]=='D')
        {
            operatii[nivel]=1;
            i+=2;
            continue;
        }
        if(v[i]=='O'&&v[i+1]=='R')
        {
            operatii[nivel]=2;
            i++;
            continue;
        }
        if(v[i]=='N'&&v[i+1]=='O'&&v[i+2]=='T')
        {
            if(nt[nivel]==1)
                nt[nivel]=0;
            else
                nt[nivel]=1;
            i+=2;
            continue;
        }
        if(v[i]=='T'&&v[i+1]=='R'&&v[i+2]=='U'&&v[i+3]=='E')
        {
            int nr=1;
            if(nt[nivel]==1)
            {
                nr=0;
                nt[nivel]=0;
            }
            if(operatii[nivel]==0)
                stiva[nivel]=nr;
            else
            {
                if(operatii[nivel]==1)
                    stiva[nivel]=stiva[nivel]&nr;
                else if(operatii[nivel]==2)
                    stiva[nivel]=stiva[nivel]|nr;
                operatii[nivel]=0;
            }
            i+=3;
            continue;
        }
        if(v[i]=='F'&&v[i+1]=='A'&&v[i+2]=='L'&&v[i+3]=='S'&&v[i+4]=='E')
        {
            int nr=0;
            if(nt[nivel])
            {
                nr=1;
                nt[nivel]=0;
            }
            if(operatii[nivel]==0)
                stiva[nivel]=nr;
            else
            {
                if(operatii[nivel]==1)
                    stiva[nivel]=stiva[nivel]&nr;
                else if(operatii[nivel]==2)
                    stiva[nivel]=stiva[nivel]|nr;
                operatii[nivel]=0;
            }
            i+=4;
            continue;
        }
        if(v[i]=='(')
            nivel++;
        if(v[i]==')')
        {
            int nr=stiva[nivel];
            stiva[nivel]=0;
            operatii[nivel]=0;
            nt[nivel]=0;
            nivel--;
            if(nt[nivel])
            {
                if(nr==1)
                    nr=0;
                else
                    nr=1;
                nt[nivel]=0;
            }
            if(operatii[nivel]==0)
                stiva[nivel]=nr;
            else
            {
                if(operatii[nivel]==1)
                    stiva[nivel]=stiva[nivel]&nr;
                else if(operatii[nivel]==2)
                    stiva[nivel]=stiva[nivel]|nr;
                operatii[nivel]=0;
            }
        }
    }
    return stiva[1];
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    fin.get(v,10001);
    fin.get();
    fin>>n;
    lg=strlen(v);
    for(int i=1;i<=n;i++)
    {
        fin>>c;
        val[c]++;
        val[c]%=2;
        fout<<rez();
    }
    return 0;
}