Cod sursa(job #1669415)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 30 martie 2016 18:15:22
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

struct nod
{
    char info;
    nod *st,*dr;
    nod()
    {
        this->st=NULL;
        this->dr=NULL;
    }
};

nod *r;
char s[10010];
int n,i,v[35];

void exp(nod *&r);
void ad(nod *&r);
void nr(nod *&r);

void exp(nod *&r)
{
    nod *p;
    ad(r);
    p=r;
    while(s[i]=='|')
    {
        r=new nod;
        r->info='|';
        i++;
        r->st=p;
        ad(r->dr);
        p=r;
    }
}
void ad(nod *&r)
{
    nod *p;
    nr(r);
    p=r;
    while(s[i]=='&')
    {
        r=new nod;
        r->st=p;
        r->info='&';
        i++;
        nr(r->dr);
        p=r;
    }
}
void nr(nod *&r)
{
    if(s[i]=='(')
       i++,exp(r),i++;
    else
    {
        if(s[i]!='!')
        {
            r=new nod;
            r->info=s[i];
            i++;
        }
        else
        {
            r=new nod;
            r->info='!';
            i++;
            exp(r->st);
        }
    }
}
int sdr(nod *r)
{
    if(r!=NULL)
    {
        if(r->info=='|')
        {
            int a=sdr(r->st);
            int b=sdr(r->dr);
            return a | b;

        }
        else
        if(r->info=='&')
        {
            int a=sdr(r->st);
            int b=sdr(r->dr);
            return a & b;
        }
        else
        if(r->info=='!')
        {
            int a=sdr(r->st);
            return !a;
        }
        else
        if(r->info=='1')
        return 1;
        else
        if(r->info=='0')
        return 0;
        else
        return v[r->info-'A'];
    }
}
void rsd(nod *r)
{
    if(r!=NULL)
    {
        cout<<r->info<<' ';
        rsd(r->st);
        rsd(r->dr);
    }
}
int j;
int main()
{
    f.getline(s,10010);
    n=strlen(s);
    for(i=0;i+1<n;i++)
    {
        if(s[i]=='O' && s[i+1]=='R')
        {
            s[i]='|';
            for(j=i+1;j<n-1;++j)
            s[j]=s[j+1];
            --n;i--;
        }
        else
        if(s[i]=='A' && s[i+1]=='N')
        {
            s[i]='&';
            for(j=i+1;j<n-2;++j)
            s[j]=s[j+2];
            n-=2;i--;
        }
        else
        if(s[i]=='N' && s[i+1]=='O')
        {
            s[i]='!';
            for(j=i+1;j<n-2;++j)
            s[j]=s[j+2];
            n-=2;i--;
        }
        else
        if(s[i]=='T' && s[i+1]=='R')
        {
            s[i]='1';
            for(j=i+1;j<n-3;++j)
            s[j]=s[j+3];
            n-=3;i--;
        }
        else
        if(s[i]=='F' && s[i+1]=='A')
        {
            s[i]='0';
            for(j=i+1;j<n-4;++j)
            s[j]=s[j+4];
            n-=4;i--;
        }
        else
        if(s[i]==' ')
        {
            for(j=i;j<n-1;++j)
            s[j]=s[j+1];
            --n;i--;
        }
    }
    i=0;
    exp(r);
    f>>n;
    char x;
    for(i=1;i<=n;i++)
    {
        f>>x;
        v[x-'A']=!v[x-'A'];
        g<<sdr(r);
    }
}