Cod sursa(job #1170622)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 13 aprilie 2014 21:58:11
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 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];
}