Cod sursa(job #1162783)

Utilizator span7aRazvan span7a Data 31 martie 2014 23:17:13
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<fstream>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
#define M -2000000000
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
string s;
char v[10001],c;
int k=0,carac,pr[10001],p,val[10001],n,val2[10001],pr2[10001];
int calc(int a,int b,char c)
{
    if(c=='&') return a&&b;
    if(c=='|') return a||b;
}
void solve()
{
    int l,poz,j,i;

        for(i=0;i<=k;i++)
        {val2[i]=-1;pr2[i]=M;}
       for(l=1;l<=k;l++)
         {
              if(v[l]==c)val[l]=!val[l];
              val2[l]=val[l];
              pr2[l]=pr[l];
         }
    while(1)
    {
        poz=max_element(pr2+1,pr2+k+1)-pr2;
        if(pr2[poz]==M){g<<*max_element(val2+1,val2+k+1);return;}
        if(v[poz]=='!')
        {
            i=poz;
            while(val2[i]<0)i++;
            val2[poz]=!val2[i];
            val2[i]=-1;
            pr2[poz]=M;
        }
        else
        {
            i=poz;
            while(val2[i]<0)i++;
            j=poz;
            while(val2[j]<0)j--;
            val2[poz]=calc(val2[j],val2[i],v[poz]);
            val2[i]=-1;
            val2[j]=-1;
            pr2[poz]=M;
        }
    }
}
void citire()
{
     int i;
    getline(f,s);
    carac=s.size();
    for(i=0;i<=carac;i++)
        {val[i]=-1;pr[i]=M;}
    for(i=0;i<carac;)
    {
        if(s[i]==' ')i++;
        if(s[i]=='A'&&s[i+1]=='N')

                {

                    ++k;
                       v[k]='&';
                    pr[k]=p+2;i+=3;
                }
        if(s[i]=='O'&&s[i+1]=='R')
                {

                    ++k;
                     v[k]='|';
                    pr[k]=p+1;i+=2;
                }
        if(s[i]=='N'&&s[i+1]=='O')
        {
            p++;
            ++k;
             v[k]='!';
            pr[k]=p+3;i+=3;
          /*  if(s[i+1]=='N'&&s[i+2]=='O')
            {pr[++k]=p+4;i+=4;}*/
        }
        if(s[i]=='('){p+=5;i++;}
        if(s[i]==')'){p-=5;i++;}
        if(s[i]=='T'&&s[i+1]=='R')
            {
                ++k;val[k]=1;i+=4;
            }
        if(s[i]=='F'&&s[i+1]=='A')
        {
            ++k;val[k]=0;i+=5;
        }

        if(isalpha(s[i])&&isalpha(s[i+1])==0)
        {
          ++k;v[k]=s[i];
        val[k]=0;  i++;
        }
    }
}
int main()
{
    int i;
    citire();
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>c;
        solve();
    }


    return 0;
}