Cod sursa(job #873519)

Utilizator Kira96Denis Mita Kira96 Data 7 februarie 2013 12:30:18
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.34 kb
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
int k,to,i,n,gr[300],t,no,m,nr[2000];
bool fk[2000],v[400];
char s[2000],ex[2000],c;
stack <char> st;
int main ()
{
    freopen ("bool.in","r",stdin);
    freopen ("bool.out","w",stdout);
    v['t']=1;
    gr['o']=1;
    gr['a']=1;
    gr['n']=2;
    gets(s+1);
    s[0]='(';
    n=strlen(s);
    s[n]=')';
    for(i=0;i<=n;++i)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='(')
        {
            st.push(s[i]);
            ++k;
        }
        else
            if((s[i]<='Z'&&s[i]>='A')&&(s[i+1]==' '||s[i+1]==')'))
            {
                ex[++t]=s[i];
                if(no)
                {
                v[s[i]]=1-v[s[i]];
                no=!no;
                nr[k]--;
                }
            }
            else
            {
                if(s[i]=='O')
                {
                	if(no)
                	c='a';
                	else
                    c='o';
                    while(!st.empty()&&st.top()!='('&&gr[st.top()]>=gr[c])
                    {
                        ex[++t]=st.top();
                        st.pop();
                    }
                    st.push(c);
                    i++;
                }
                else
                if(s[i]=='A')
                {
                	if(no)
                	c='o';
                	else
                    c='a';
                    while(!st.empty()&&st.top()!='('&&gr[st.top()]>=gr[c])
                    {
                        ex[++t]=st.top();
                        st.pop();
                    }
                    st.push(c);
                    i+=2;
                }
                else
                if(s[i]=='N')
                {
                	++nr[k];
                	no=!no;
                	i+=2;
                }
                else
                if(s[i]=='T')
                {
                	if(no)
                	c=='f';
                	else
                    c='t';
                    ex[++t]=c;
                    i+=3;
                }
                else
                if(s[i]=='F')
                {
                	if(no)
                	c='t';
                	else
                    c='f';
                    ex[++t]=c;
                    i+=4;
                }
                else
                {
                    while(!st.empty()&&st.top()!='(')
                    {
                        ex[++t]=st.top();
                        st.pop();
                    }
                    st.pop();
                    no=no-nr[k]%2;
                    --k;
                }
            }
    }
    scanf("%d\n",&m);
    scanf("%s",s);
    for(i=0;i<m;++i)
    {
        v[s[i]]=!v[s[i]];
        for(k=1;k<=t;++k)
        {
            if((ex[k]>='A'&&ex[k]<='Z')||(ex[k]=='t'||ex[k]=='f'))
            {
                fk[++to]=v[ex[k]];
            }
            else
            {
                switch(ex[k])
                {
                case 'o': fk[to-1]=fk[to]||fk[to-1]; break;
                case 'a': fk[to-1]=fk[to]&&fk[to-1]; break;
                }
                    --to;
            }
        }
        printf("%d",fk[1]);
        --to;
    }
    return 0;
}