Cod sursa(job #2289688)

Utilizator mihaimodiMihai Modi mihaimodi Data 25 noiembrie 2018 00:10:22
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");

int i,n,k1,k2;
int st1[501],pr[200];
char s[1005],st2[501],var[101];
bool val[100];


int eval(int K1,int K2,char semn)
{
    if(semn=='!')
    {
        if(st1[K1]==0)
            return 1;
        else if(st1[K1]==1)
            return 0;
    }
    else if(semn=='&')
    {
        if(st1[K1]==2&&st1[K2]==2)
            return 1;
        return 0;
    }
    else if(semn=='|')
    {
        if(st1[K1]==2||st1[K2]==2)
            return 1;
        return 0;
    }
}

int main()
{
    pr['|']=1;
    pr['&']=2;
    pr['!']=3;
    pr['(']=0;
    fin.getline(s,1005);
    fin>>n;
    fin.get();
    fin.get(var+1,101);
    for(int ii=1;ii<=n;ii++)
    {
        if(val[var[ii]]==0)
            val[var[ii]]=1;
        else
            val[var[ii]]=0;

        memset(st1,0,sizeof(st1));
        memset(st2,0,sizeof(st2));

        for(i=0;s[i]!=0;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                char aux[7]={0};
                int len=0;
                while(s[i]>='A'&&s[i]<='Z')
                {
                    len++;
                    aux[len-1]=s[i];
                    i++;
                }
                i--;
                if(len==1)
                    st1[++k1]=val[aux[0]];

                else if(len==2)
                    st2[++k1]='|';
                else if(len==3)
                {
                    if(aux[0]=='N')
                        st2[++k2]='!';
                    else
                        st2[++k2]='&';
                }
                else if(len==4)
                    st1[++k1]=1;
                else
                    st1[++k1]=0;
            }
            else if(s[i]=='(')
                st2[++k2]='(';
            else if(s[i]==')')
            {
                while(st1[k1]!='(')
                {
                    int rez=eval(k1,k1-1,st2[k2]);
                    k1--;k2--;
                    st1[k1]=rez;
                }
                k1--;
            }
            else
            {
                while(k2>0&&k1>0&&pr[st2[k2]]>=pr[s[i]])
                {
                    int rez=eval(k1,k1-1,st2[k2]);
                    k1--;
                    k2--;
                    st2[k2]=rez;
                }
                st2[++k2]=s[i];
            }
        }
        fout<<st1[1];
    }
    return 0;

}