Cod sursa(job #2368799)

Utilizator stefan1anubystefan popa stefan1anuby Data 5 martie 2019 18:06:49
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.52 kb
//#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;

#include <fstream>
ifstream cin("bool.in");
ofstream cout("bool.out");

char sir[1005];
vector < string > v;
bool val[30];
vector < string > st;
stack < int > stpar;
int cnt;
void read()
{
    string c;
    int len,i;
    cin.getline(sir,1005);
    len=strlen(sir);
    for(i=0; i<len; i++)
    {
        if(sir[i]=='(' || sir[i]==')')
        {
            c=sir[i];
            v.push_back(c);
        }
        else if(sir[i]=='O' && sir[i+1]=='R')
        {
            c="OR";
            v.push_back(c);
            i++;
        }
        else if(sir[i]=='N' && sir[i+1]=='O' && sir[i+2]=='T')
        {
            c="NOT";
            v.push_back(c);
            i+=2;
        }
        else if(sir[i]=='A' && sir[i+1]=='N' && sir[i+2]=='D')
        {
            c="AND";
            v.push_back(c);
            i+=2;
        }
        else if(sir[i]=='T' && sir[i+1]=='R' && sir[i+2]=='U' && sir[i+3]=='E')
        {
            c="TRUE";
            v.push_back(c);
            i+=3;
        }
        else if(sir[i]=='F' && sir[i+1]=='A' && sir[i+2]=='L' && sir[i+3]=='S' && sir[i+4]=='E')
        {
            c="FALSE";
            v.push_back(c);
            i+=4;
        }
        else if(sir[i]<='Z' && sir[i]>='A')
        {
            c=sir[i];
            v.push_back(c);
        }
    }
    v.push_back(")"); /// PENTRU FINALIZARE
}
bool neg(bool a)
{
    return !a;
}
bool in(string a)
{
    if(a=="TRUE")
        return true;
    else
        return false;
}
string out(bool a)
{
    if(a==true)
        return "TRUE";
    else
        return "FALSE";
}
bool sau(bool a, bool b)
{
    return a|b;
}
bool si(bool a, bool b)
{
    return a&b;
    //ai grija ca trebuie sa inlocuiesti & cu | si b cu false
}
void afis()
{
    int i,j;
    for(i=0; i<v.size(); i++)
        cout<<v[i]<<endl;
}
void afis_stiva()
{
    int i;
    cout<<endl;
    for(i=0; i<=cnt; i++)
        cout<<st[i]<<" ";
    cout<<endl;
}
void debugging()
{
    int i;
    cout<<endl;
    for(i=0; i<=cnt; i++)
    {
        cout<<st[i]<<" "<<i<<endl;
    }
    cout<<endl;
}
void reset()
{
    while(st.empty()==false)
        st.pop_back();
    while(stpar.empty()==false)
        stpar.pop();
    cnt=0;
}
void solve()
{
    int i,j;
    char c;
    string h;
    st.push_back(".");
    st.push_back("(");
    stpar.push(1);
    cnt++;
    for(i=0; i<v.size(); i++)
    {
        if(v[i]<="Z" && "A"<=v[i] && v[i].size()==1)
        {
            h=v[i];
            c=h[0];
            if(val[c-'A'+1]==true)
                st.push_back("TRUE");
            else
                st.push_back("FALSE");
        }
        else
            st.push_back(v[i]);
        cnt++;
        while(st[cnt-1]=="NOT" && (st[cnt]=="FALSE" || st[cnt]=="TRUE"))
        {
            st[cnt-1]=out(neg(in(st[cnt])));
            cnt--;
            st.pop_back();
        }
        if(st[cnt]=="(")
        {
            stpar.push(cnt);
        }
        if(st[cnt]==")" && stpar.empty()==false)
        {
            for(j=stpar.top()+1; j<cnt; j++)
            {
                if(st[j]=="AND")
                {
                    st[j-1]=out(si(in(st[j-1]),in(st[j+1])));
                    st[j]="OR";
                    st[j+1]="FALSE";
                }
            }
            for(j=stpar.top()+1; j<cnt; j++)
            {
                if(st[j]=="OR")
                {
                    st[j+1]=out(sau(in(st[j-1]),in(st[j+1])));
                    st[j]="OR";
                }
            }
            st[stpar.top()]=st[cnt-1];
            while(st.empty()==false && cnt!=stpar.top())
            {
                st.pop_back();
                cnt--;
            }
            stpar.pop();
        }
        while(st[cnt-1]=="NOT" && (st[cnt]=="FALSE" || st[cnt]=="TRUE"))
        {
            st[cnt-1]=out(neg(in(st[cnt])));
            cnt--;
            st.pop_back();
        }
        //afis_stiva();
    }
    if(st[1]=="TRUE")
        cout<<1;
    else
        cout<<0;
    //cout<<st[1];
    reset();
}
int main()
{
    int n,i;
    char c;
    read();
    //solve();
    cin>>n;
    for(i=1; i<=n; i++)
    {
        cin>>c;
        if(val[c-'A'+1]==true)
            val[c-'A'+1]=false;
        else
            val[c-'A'+1]=true;
        solve();
    }
    return 0;
}