Cod sursa(job #135351)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 13 februarie 2008 17:26:30
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdio.h>
#include <string.h>

using namespace std;

char s[1100],a[110],l[30];
int n;

void citire()
{
    freopen("bool.in","r",stdin);
    fgets(s,1100,stdin);
    scanf("%d\n", &n);
    fgets(a,110,stdin);
    if (a[strlen(a)-1]=='\n')
        a[strlen(a)-1]=0;
    if (s[strlen(s)-1]=='\n')
        s[strlen(s)-1]=0;
    fclose(stdin);
}

int deparantezare(char s[], int &inc, int &sf)
{
    int p=1, o=0, l=strlen(s)-1;
    if (s[inc]=='(' && s[l]==')')
    {
        for (int i=inc+1; i<l; i++)
        {
            if (s[i]=='(')
                ++p;
            else
            if (s[i]==')')
                --p;
            if (p==0)
            {
                o=1;
                break;
            }
        }
        if (!o)
        {
            inc++;
            sf--;
            s[l]=0;
            return 0;
        }
    }
    return 1;
}

int litera(char s[])
{
    int w;
    if (strlen(s)==5 && s[0]=='T' && s[1]=='R' && s[2]=='U' && s[3]=='E')
        return 1;
    else
    if (strlen(s)==6 && s[0]=='F' && s[1]=='A' && s[2]=='L' && s[3]=='S' && s[4]=='E')
        return 0;
    else
    {
        char q;
        q=s[strlen(s)-1];
        w=l[q-65];
        if (strlen(s)>2)
        for (int i=strlen(s); i>=0; i--)
            if (s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
                w=!w;
    }
    return w;
}

int rezolvare(char s[])
{
    while (s[strlen(s)-1]==' ')
        s[strlen(s)-1]=0;
    int paranteza=0,p=0,aa=0,oo=0;
    //printf("%s\n",s);
    int e=strlen(s)-1;
    int inc=0,sf=e;
    while (s[inc]=='(')
    {
        if (deparantezare(s,inc,sf))
            break;
    }
    for (int i=sf; i>=inc; i--)
    {
        if (s[i]==')')
        {
            --p;
            paranteza++;
        }
        else if (s[i]=='(')
                ++p;
        else
        if (p==0 && s[i]=='A' && s[i+1]=='N' && s[i+2]=='D' && aa==0)
            aa=i;
        else
        if (p==0 && s[i]=='O' && s[i+1]=='R' && oo==0)
            oo=i;
    }
    while (s[inc]=='(' && s[sf]==')' && paranteza==1)
    {
        inc++;
        s[sf]=0;
        sf--;
    }
    char *w;
    int z,x;
    if (aa)
    {
        s[aa]=0;
        w=s+inc;
        z=rezolvare(w);
        w=s+aa+4;
        x=rezolvare(w);
        return z&x;
    }
    else
    if (oo)
    {
        s[oo]=0;
        w=s+inc;
        z=rezolvare(w);
        w=s+oo+3;
        x=rezolvare(w);
        return z|x;
    }
    else
    return litera(s);
}

int main()
{
    freopen("bool.out","w",stdout);
    citire();
    for (int i=0; i<n; i++)
    {
        l[a[i]-65]=!l[a[i]-65];
        printf("%d",rezolvare(s));
    }
    fclose(stdout);
    return 0;
}