Cod sursa(job #171371)

Utilizator TociToxAnonim Anonim TociTox Data 4 aprilie 2008 10:14:41
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.14 kb
#include<fstream.h>   
#include<string.h>   
int a[30], v[1002], o[1002], k, l, n, m, i;   
char c[1002], x[10], s;   
ifstream f("bool.in");   
ofstream g("bool.out");   
  
void solve();   
void det();   
void calc();   
  
int main()   
{       int q;   
    char w;   
    f.getline(c, 1001, '\n');   
    f>>n; f.get();   
    for(q=0; q<n; q++)   
    {       f.get(w);   
        a[w-'A']=!a[w-'A'];   
        solve();   
    }   
    g<<'\n';   
    g.close();   
    return 0;   
}   
  
void solve()   
{       m=strlen(c);   
    k=0; l=0;   
    for(i=0; i<m;)   
    {   det();   
        switch(s)   
        {   case 1:   
                l++; o[l]=1; break;   
            case 2:   
                while(o[l]!=1 && l>0)   
                {   calc(); l--;   
                }   
                l--; break;   
            case 3:   
                l++; o[l]=3; break;   
            case 4:   
                while((o[l]==3 || o[l]==4) && l>0)   
                {   calc(); l--;   
                }   
                l++; o[l]=4; break;   
            case 5:   
                while(o[l]!=1 && l>0)   
                {   calc(); l--;   
                }   
                l++; o[l]=5; break;   
            case 6:   
                k++; v[k]=1; break;   
            case 7:   
                k++; v[k]=0; break;   
            default :   
                k++; v[k]=a[s-'A']; break;   
        }   
    }   
    while(l>0 && k>0)   
    {       calc(); l--;   
    }   
    g<<v[1];   
}   
  
void calc()   
{       if(k==1)   
    {   if(l>0 && o[l]==3)   
        {   v[k]=!v[k];   
        }   
        return;   
    }   
    switch(o[l])   
    {       case 3:   
            v[k]=!v[k]; break;   
        case 4:   
            v[k-1]=v[k] && v[k-1]; k--; break;   
        case 5:   
            v[k-1]=v[k] || v[k-1]; k--; break;   
    }   
}   
  
void det()   
{   int j=0;   
    char x[10];   
    if(c[i]=='(' || c[i]==')')   
    {       x[j]=c[i]; j++; i++;   
    }   
    else  
        while(c[i]!=' ' && c[i]!='(' && c[i]!=')' && i<m)   
        {   x[j]=c[i]; i++; j++;   
        }   
    x[j]='\0';   
    if(strcmp(x, "(")==0)   
    {   s=1;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, ")")==0)   
    {   s=2;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, "NOT")==0)   
    {   s=3;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, "AND")==0)   
    {   s=4;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, "OR")==0)   
    {   s=5;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, "TRUE")==0)   
    {   s=6;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    if(strcmp(x, "FALSE")==0)   
    {   s=7;   
        if(c[i]==' ')   
            i++;   
        return;   
    }   
    s=c[i-1];   
    if(c[i]==' ')   
        i++;   
}  
#include<fstream.h>
#include<string.h>
int a[30], v[1002], o[1002], k, l, n, m, i;
char c[1002], x[10], s;
ifstream f("bool.in");
ofstream g("bool.out");

void solve();
void det();
void calc();

int main()
{       int q;
	char w;
	f.getline(c, 1001, '\n');
	f>>n; f.get();
	for(q=0; q<n; q++)
	{       f.get(w);
		a[w-'A']=!a[w-'A'];
		solve();
	}
	g<<'\n';
	g.close();
	return 0;
}

void solve()
{       m=strlen(c);
	k=0; l=0;
	for(i=0; i<m;)
	{	det();
		switch(s)
		{	case 1:
				l++; o[l]=1; break;
			case 2:
				while(o[l]!=1 && l>0)
				{	calc(); l--;
				}
				l--; break;
			case 3:
				l++; o[l]=3; break;
			case 4:
				while((o[l]==3 || o[l]==4) && l>0)
				{	calc(); l--;
				}
				l++; o[l]=4; break;
			case 5:
				while(o[l]!=1 && l>0)
				{	calc(); l--;
				}
				l++; o[l]=5; break;
			case 6:
				k++; v[k]=1; break;
			case 7:
				k++; v[k]=0; break;
			default :
				k++; v[k]=a[s-'A']; break;
		}
	}
	while(l>0 && k>0)
	{       calc(); l--;
	}
	g<<v[1];
}

void calc()
{       if(k==1)
	{	if(l>0 && o[l]==3)
		{	v[k]=!v[k];
		}
		return;
	}
	switch(o[l])
	{       case 3:
			v[k]=!v[k]; break;
		case 4:
			v[k-1]=v[k] && v[k-1]; k--; break;
		case 5:
			v[k-1]=v[k] || v[k-1]; k--; break;
	}
}

void det()
{	int j=0;
	char x[10];
	if(c[i]=='(' || c[i]==')')
	{       x[j]=c[i]; j++; i++;
	}
	else
		while(c[i]!=' ' && c[i]!='(' && c[i]!=')' && i<m)
		{	x[j]=c[i]; i++; j++;
		}
	x[j]='\0';
	if(strcmp(x, "(")==0)
	{	s=1;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, ")")==0)
	{	s=2;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "NOT")==0)
	{	s=3;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "AND")==0)
	{	s=4;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "OR")==0)
	{	s=5;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "TRUE")==0)
	{	s=6;
		if(c[i]==' ')
			i++;
		return;
	}
	if(strcmp(x, "FALSE")==0)
	{	s=7;
		if(c[i]==' ')
			i++;
		return;
	}
	s=c[i-1];
	if(c[i]==' ')
		i++;
}