Cod sursa(job #2338803)

Utilizator cosceexcosceex cosceex Data 7 februarie 2019 20:33:29
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 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];
 }