Cod sursa(job #2548323)

Utilizator pregoliStana Andrei pregoli Data 16 februarie 2020 15:22:35
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
char c[100001],c1;
char var[101];
char v[100001];
bool fr[200];
int  n;
int i;
int expresie(),termen(),factor();

int factor()
{
    int r=0;
    while(c[i]=='!')
    {
        i++;
        r=!r;
    }
    if(c[i]=='(')
    {
        i++;
        r^=expresie();
        i++;
    }
    else
    {
        int nr=c[i];
        r = fr[nr];
        i++;
    }
    return r;
}

int termen()
{
    int r;
    r=factor();
    while(c[i]=='&')
    {
        i++;
        int z=factor();
        r &=z;
    }
    return r;
}

int expresie()
{
    int r=termen();
    while(c[i]=='|')
    {
        //if(c[i]=='|')
        {
            i++;
            int z=termen();
            r|=z;
        }
    }
    return r;
}

int main()
{
    fr['[']=1;
    int k=-1;
    while( fin>>v)
    {
        if(v[0]>='0'&&v[0]<='9')
            break;
        for(int i=0; i<strlen(v); i++)
        {
            if(v[i]==' ')
                continue;
            else if(v[i]=='T'&&v[i+1]=='R')
            {
                c[++k]='[';
                i+=3;
            }
            else if(v[i]=='F'&&v[i+1]=='A')
            {
                c[++k]=']';
                i+=4;
            }

            else if(v[i]=='A'&&v[i+1]=='N')
            {
                c[++k]='&';
                i+=2;
            }
            else if(v[i]=='O'&&v[i+1]=='R')
            {
                c[++k]='|';
                i++;
            }
            else if(v[i]=='N'&&v[i+1]=='O')
            {
                c[++k]='!';
                i+=2;
            }
            else
                c[++k]=v[i];
        }
    }
/// for(int i=0;i<=strlen(c);i++)
    /// fout<<c[i];
    fin>>var;
    for(int i1=0; i1<strlen(var); i1++)
    {
        int    numar=var[i1]-0;
        fr[numar]=1-fr[numar];
        i=0;
        fout<<expresie();
    }

}