Cod sursa(job #160801)

Utilizator FlorinC1996Florin C FlorinC1996 Data 16 martie 2008 21:14:38
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
 #include<stdio.h>   
#include<string.h>   
#define nm 1005   
char s[nm],var[102];   
int val[256],n,c;   
int rezolva();   
void citire();   
  
int main()   
{int i;   
 citire();   
 freopen("bool.out","w",stdout);   
 for(i=1;i<=n;i++)   
   {val[var[i-1]]=!val[var[i-1]];   
    c=0;   
    printf("%d",rezolva());   
    }   
 fclose(stdout);   
 return 0;   
 }   
  
void citire()   
{freopen("bool.in","r",stdin);   
 fgets(s,nm,stdin);   
 //fgets(s,nm,stdin);   
  
 scanf("%d",&n);   
 fgets(var,100,stdin);   
 fgets(var,100,stdin);   
 }   
  
  
int rezolva()   
  
{int op[100],i,x[100],adr[100],op1[100];   
 x[0]=0;op[0]=0;op1[0]=0;   
  
 for(;c<strlen(s);)   
    if(s[c]==' ')   
      c++;   
    else if(s[c]=='(')   
      {c++;x[++x[0]]=rezolva();}   
    else if(s[c]==')')   
      {c++;break;}   
  
    else if(s[c]=='T'&&s[c+1]=='R'&&s[c+2]=='U'&&s[c+3]=='E')   
           {x[++x[0]]=1;c+=4;}   
    else if(s[c]=='F'&&s[c+1]=='A'&&s[c+2]=='L'&&s[c+3]=='S'&&s[c+4]=='E')   
           {x[++x[0]]=0; c+=5;}   
  
    else if(s[c]=='O'&&s[c+1]=='R')   
           {op[++op[0]]=2;c+=2;   
           adr[op[0]]=x[0];}   
    else if(s[c]=='A'&&s[c+1]=='N'&&s[c+2]=='D')   
           {op[++op[0]]=1;c+=3;adr[op[0]]=x[0];}   
    else if(s[c]=='N'&&s[c+1]=='O'&&s[c+2]=='T')   
           {op[++op[0]]=0;c+=3;adr[op[0]]=x[0];}   
  
    else x[++x[0]]=val[s[c++]];   
  
 for(i=1;i<=op[0];i++)   
  if(op[i]==0)   
    x[adr[i]+1]=!x[adr[i]+1];   
  else  
    op1[++op1[0]]=op[i];   
  
 op[0]=0;       
  
 int n=1;   
 for(i=1;i<x[0];i++)   
  if(op1[i]==1)   
   x[n]=x[n]&&x[i+1];   
  else  
   x[++n]=x[i+1];   
  
 for(i=2;i<=n;i++)   
   x[1]=x[1]||x[i];   
  
  
 return x[1];   
 }