Cod sursa(job #851092)

Utilizator misinoonisim necula misino Data 9 ianuarie 2013 15:36:26
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int i,l,n,v[10],op[2010],st[1010],nu[1012];
char s[1010],s1[110];
void evaluareexp()
{
    memset(nu,0,2000);
    memset(st,0,2000);
    int i,vf=0,vf1,j1,j;
    for(i=0;i<=l;++i)
    if(s[i]=='(')
    {
        ++vf;
        st[vf]=-1;
    }
    else
    if(s[i]=='A'&&s[i+1]=='N')
    {
        i+=2;
        op[vf+1]=1;
    }
    else
    if(s[i]=='O'&&s[i+1]=='R')
    {
        ++i;
        op[vf+1]=2;
    }
    else
    if(s[i]=='N'&&s[i+1]=='O')
    {
        i+=2;
        nu[vf+1]=!nu[vf+1];
    }
    else
    if(s[i]=='F'&&s[i+1]=='A')
    {
        i+=4;
        ++vf;
        st[vf]=0;
    }
    else
    if(s[i]=='T'&&s[i+1]=='R')
    {
        i+=3;
        ++vf;
        st[vf]=1;
    }
    else
    if(s[i]>='A'&&s[i]<='Z')
    {
        ++vf;
        st[vf]=v[s[i]-'A'];
        if(nu[vf])
        st[vf]=!st[vf],nu[vf]=0;
    }
    else
    if(s[i]==')')
    {
        j=vf;
        while(st[j]!=-1)
        --j;
        vf1=j+1;j1=j;
        for(j+=2;j<=vf;++j)
        if(op[j]==1)
        {
            st[vf1]=st[j]&&st[vf1];
        }
        else
        ++vf1,st[vf1]=st[j],op[vf1]=op[j];
        vf=vf1;
        for(j=j1+2;j<=vf;++j)
        st[j1+1]=st[j]||st[j1+1];
        st[j1]=st[j1+1];
        vf=j1;
        if(nu[vf])
        st[vf]=!st[vf],nu[vf]=0;
    }
    vf1=1;
    for(j=2;j<=vf;++j)
    if(op[j]==1)
    {
        st[vf1]=st[j]&&st[vf1];
    }
    else
    ++vf1,st[vf1]=st[j],op[vf1]=op[j];
    vf=vf1;
    for(j=2;j<=vf;++j)
    st[1]=st[j]||st[1];
    if(nu[1])
    st[1]=!st[1],nu[vf]=0;
}
int main()
{
    f.getline(s,2009);
    l=strlen(s);
    if(s[l]=='\n')
    --l;
    --l;
    f>>n;
    f.getline(s1,209);
    f.getline(s1,209);
    for(i=1;i<=n;++i)
    {
        v[s1[i-1]-'A']=!v[s1[i-1]-'A'];
        evaluareexp();
        g<<st[1];
    }
    g<<'\n';
    return 0;
}