Cod sursa(job #1579401)

Utilizator adiXMGemene Adrian adiXM Data 24 ianuarie 2016 18:29:56
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.22 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;
const int NMAX=1005;
ifstream f("bool.in");
ofstream g("bool.out");
char s[NMAX];
char vect[NMAX];
int Poz[NMAX],val[NMAX];
stack<int> St;
inline int Solve(int st,int dr)
{
    int x=0,sol=0,op=5,schimba=0;
    vector <int> v;
    for(int i=st;i<=dr;i++)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='(')
        {
            x=Solve(i+1,Poz[i]-1);
            i=Poz[i]+1;
            continue;
        }
        if(s[i]>='A' && s[i]<='Z')
            x=val[s[i]-'A'];
        else
            if(s[i]=='1')
                x=1;
            else
                x=0;
        /*if(v.size()==0)
            v.push_back(x);*/
        if(s[i]!='!')
        {
            if(s[i]=='&')
            {
                op=2;
                continue;
            }
            else
                if(s[i]=='|')
                {
                    op=3;
                    continue;
                }
            if(op==2)
                v.back()&=x^schimba;
            else
                v.push_back(x^schimba);
            schimba=0;
        }
        else
            if(s[i]=='!')
                schimba^=1;

    }
    /*if(op==2)
        v.back()&=x^schimba;
    else
        v.push_back(x^schimba);*/
    sol=0;
    for(int i=0;i<v.size();i++)
    {
        sol|=v[i];
        //g<<v[i]<<" ";
    }
    return sol;
}
int main()
{
    int n;
    char ch;
    f.getline(s+1,NMAX);
    int len=0;
    for(int i=1;s[i];i++)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='A' && s[i+1]=='N')
        {
            s[i]='&';
            s[i+1]=' ';
            s[i+2]=' ';
            i+=3;
        }
        else
            if(s[i]=='O' && s[i+1]=='R')
            {
               s[i]='|';
               s[i+1]=' ';
               i+=2;
            }
        else
            if(s[i]=='N' && s[i+1]=='O')
            {
                s[i]='!';
                s[i+1]=' ';
                s[i+2]=' ';
                i+=3;
            }
        else
            if(s[i]=='T' && s[i+1]=='R')
            {
                s[i]='1';
                s[i+1]=' ';
                s[i+2]=' ';
                s[i+3]=' ';
                i+=4;
            }
        else
            if(s[i]=='F' && s[i+1]=='A')
            {
                s[i]='0';
                s[i+1]=' ';
                s[i+2]=' ';
                s[i+3]=' ';
                s[i+4]=' ';
                i+=5;
            }

    }
    for(int i=1;s[i];i++)
    {
        if(s[i]==' ')
            continue;
        vect[++len]=s[i];
    }
    for(int i=1;i<=len;i++)
        s[i]=vect[i];
    s[len+1]=0;
    for(int i=1;s[i];i++)
    {
        if(s[i]=='(')
            St.push(i);
        else
            if(s[i]==')')
            {
                Poz[St.top()]=i;
                St.pop();
            }
    }
    f>>n;
    int na=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        f>>ch;
        val[ch-'A']^=1;
        g<<Solve(1,na);
    }
    //g<<Solve(1,na);
    //g<<(s+1)<<"\n";
    return 0;
}