Cod sursa(job #2271457)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 28 octombrie 2018 17:15:37
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 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];
	if(fr[nr]==r)
	r=0;
	else
        r=1;
		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();
    }

}