Cod sursa(job #907362)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 7 martie 2013 21:36:27
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int n, i, m, j, p, u;
char s[2010], c[110], *a;
bool v[110], aux;

int OR();
int AND();
int NSP();

int AND(){
    int rez=NSP();
    while( (*a)=='&' )
    {
        p++;
        rez&=NSP();
    }
    return rez;
}

int NSP(){
    int rez;
    if( (*a)=='(' )
    {
        p++;
        rez=OR();
        p++;
    }
    else
    {
        if( (*a) == '!' )
        {
            p++;
            rez=NSP();
            rez^=1;
        }
        else
        {
            if( (*a)=='1' )
            {
                rez = 1;
                p++;
            }
            else
            {
                if( (*a)=='0' )
                {
                    rez=0;
                    p++;
                }
                else
                {
                    rez=v[ (*a)-'A' ];
                    p++;
                }
            }
        }
    }
    return rez;
}

int OR(){
    int rez=AND();
    while( (*a)== '|' )
    {
        p++;
        rez|=AND();
    }
    return rez;
}

int main(){
	f.get(s+1, 2000);
	f.get();
	f>>n;
	f.get();
	f.get(c, n);
	f.close();
	m=strlen(s+1);
	for(i=1; i<=m; i++)
	{
		if(s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
		{
			strcpy(s+i+1, s+i+3);
			s[i]='&';
			m-=2;
		}
		else if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
		{
			strcpy(s+i+1, s+i+4);
			s[i]='1';
			m-=3;
		}
		else if(s[i]=='F' && s[i+1]=='A' && s[i+2]=='l' && s[i+3]=='S' && s[i+4]=='E')
		{
			strcpy(s+i+1, s+i+5);
			s[i]='1';
			m-=4;
		}
		else if(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
		{
			strcpy(s+i+1, s+i+3);
			s[i]='^';
			m-=2;
		}
		else if(s[i]=='O' && s[i+1]=='R')
		{
			strcpy(s+i+1, s+i+2);
			s[i]='|';
			m--;
		}
	}
	p=2;
	u=2;
	j=m;
	while(u<=m)
	{
		if(s[u]==' ')
		{
			j--;
			u++;
		}
		s[p]=s[u];
		p++;
		u++;
	}
	s[u+1]='\n';
	for(i=0; i<n; i++)
    {
        v[ c[i]-'A' ]^=1;
        a=s;
        aux=OR();
        if(aux==0)
            aux=1;
        else
            aux=0;
        g<<aux;
    }
	g.close();
	return 0;
}