Cod sursa(job #543117)

Utilizator Ast09Stoica Anca Ast09 Data 27 februarie 2011 16:12:28
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<fstream.h>
ifstream f("bool.in");
ofstream g("bool.out");
char s[1005],s1[1005],stiva[1005],pol[1005],sir[1005];
int vf,n,m,var[30],k;
int v[1005];
int prioritate(char c)
{   if(c=='(') return 0;
	if(c=='+' ) return 1;
	if(c=='_')return 3; 
	return 2;
}

void calculeaza()
{
	int i;
// evaluarea expresiei
vf=0;
  for(i=0;i<k;i++)
	switch(pol[i])
          { case '_':v[vf]^=1;break;
	      case '+':v[vf-1] |= v[vf],vf--;break;
             case '*':v[vf-1] &=v[vf],vf--;break;
		case '1': v[++vf]=1; break;
	      case '0': v[++vf]=0; break;
		default: v[++vf]=var[pol[i]-'A'];
		}
  g<<v[1]; 
}

int main()
{ int i;
  s[0]='(';
  f.getline(s+1,100002);
  n=strlen(s);
  s[n++]=')';
  s[n]='\0';
  f>>m;
  f.get();
  f.getline(sir,1001);
  
  k=0;
  i=0;
  while(i<n)
	  switch(s[i])
  {case '(':s1[k++]=s[i++];break;
   case ')':s1[k++]=s[i++];break;
   case ' ': i++;break;	  
   case 'N': if(s[i+1]=='O')s1[k++]='_',i=i+3;
               else s1[k++]=s[i++];break;
   case 'O': if(s[i+1]=='R')s1[k++]='+',i=i+2;
               else s1[k++]=s[i++];break;
   case 'A': if(s[i+1]=='N')s1[k++]='*',i=i+3;
               else s1[k++]=s[i++];break;
   case 'T': if(s[i+1]=='R')s1[k++]='1',i=i+4;
               else s1[k++]=s[i++];break;
   case 'F': if(s[i+1]=='A')s1[k++]='0',i=i+5;
               else s1[k++]=s[i++];break;
   default:
	   s1[k++]=s[i++];
	  }
	  
	s1[k]=0;

//construiesc forma poloneza
strcpy(s,s1);	
n=strlen(s);
k=-1;
for(i=0;i<n;i++)
	{ 
		if(s[i]=='(')stiva[++vf]='(';
	    else 
		if(s[i]==')')
		      { while(stiva[vf]!='(') pol[++k]=stiva[vf--];vf--;}
			else 	 
			   if(s[i]=='+' || s[i]=='*')
			   {  while (prioritate(stiva[vf])>=prioritate(s[i])) pol[++k]=stiva[vf--];
				stiva[++vf]=s[i];
			   }
				   else if(s[i]=='_')
									   { while (prioritate(stiva[vf])>prioritate(s[i])) pol[++k]=stiva[vf--];
												stiva[++vf]=s[i];
									   }
									   else pol[++k]=s[i];
	   }
pol[++k]=0;	 

for(i=0;i<m;i++)
	{ var[sir[i]-'A']^=1;
         calculeaza();
	}
  f.close(); g.close();
  return 0;
}