Cod sursa(job #66469)

Utilizator BMCBou Marian Catalin BMC Data 18 iunie 2007 21:30:44
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
//BMC
#include<fstream.h>
#include<string.h>
ifstream fin("bool.in");
ofstream fout("bool.out");

int prioritate(char c)
{
  if(c=='n')return 3;
  if(c==')'||c=='(')return 0;
  if(c=='o')return 1;
  if(c=='a')return 2;
}

int main()
{
  int j,n,i,l,k,r,d[27];
  char ex[1001],st[1001],fp[1000],v;

  fin.getline(fp,1001);
  n=strlen(ex);
  l=0;
  for(i=0;i<n;i++)
  {
    if( ( fp[i]>='A' && fp[i]<='Z' ) || ( fp[i]==')' || fp[i]=='(' ) ) ex[++l]=fp[i];
    if( fp[i]=='A' && fp[i+1]=='N') { ex[l]='a'; i+=2; }
    if( fp[i]=='O' && fp[i+1]=='R') { ex[l]='o'; i++;  }
    if( fp[i]=='N' && fp[i+1]=='O') { ex[l]='n'; i+=2; }
    if( fp[i]=='T' && fp[i+1]=='R') { ex[l]='1'; i+=3; }
    if( fp[i]=='F' && fp[i+1]=='A') { ex[l]='0'; i+=4; }
  }

  ex[0]='(';
  ex[++l]=')';
  n=k=0;
  for(i=0;i<=l;i++)
  {
    if( ex[i]=='(' ) st[n++]='(';
    if( ex[i]==')' ) { while( st[n-1]!='(' ) { fp[k++]=st[n-1]; n--; } k--; }
    if( ex[i]=='a' || ex[i]=='o' || ex[i]=='n' )
    {
      if( prioritate(st[k-1])>=prioritate(ex[i]) )
      {
	while( prioritate(st[k-1])>=prioritate(ex[i]) )
	  {  fp[k++]=st[n-1]; n--; }
	k--;
	st[n++]=ex[i];
      }
      else st[k++]=ex[i];
    }
    if( ex[i]>='A' && ex[i]<='Z' ) fp[k++]=ex[i];
  }
  fp[k]=NULL;
  fin>>n;
  for(i=0;i<27;i++)d[i]=0;
  for(i=1;i<=n;i++)
  {
    fin>>v;
    d[v-'A']=!d[v-'A'];
    l=r=0;
    for(j=0;j<k;j++)
    {
      if( fp[i]>='A' && fp[i]<='Z' ) st[++k]=d[fp[i]-'A'];
      else
      if(fp[i]=='0')st[++k]=0;
      else
      if(fp[i]=='1')st[++k]=1;
      else
      {
	if(fp[i]=='a') if( st[k]==1 && st[k-1]==1 ) st[--k]=1; else st[--k]=0;
	if(fp[i]=='n') st[k]=!st[k];
	if(fp[i]=='o') if( st[k]==0 && st[k-1]==0 ) st[--k]=0; else st[--k]=1;
      }
    }
  fout<<st[0];
  }
return 0;
}