Cod sursa(job #1411630)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 31 martie 2015 20:53:13
Problema Bool Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f1[27],z[1000],dif=0,f2[27],pp=0;
char s1[5000],s2[260],v[1000];
int expresie();
int factor();
int termen();
int factor2();
int factor(char s[])
{
    int val=0,semn=1,i,k;
    while(s[pp]=='N')
    {
        pp++;
        while(s[pp]>='A' && s[pp]<='Z')
            pp++;
        semn=-semn;
    }
    if(s[pp]=='(')
    {
        pp++;
        val=expresie(s);
        pp++;
        if(semn==-1)
            if(val==0)
                val=1;
            else
                val=0;
        return val;
    }
    while(s[pp]>='A' && s[pp]<='Z')
    {
        if(s[pp+1]=='R' || s[pp+1]=='A')
        {
            k=s[pp+1];
            while(s[pp]>='A' && s[pp]<='Z')
                pp++;
            if(k=='R')
                val=1;
            else
                val=0;
        }
        else{
            for(i=1; i<=10; i++)
                if(v[i]==s[pp])
                    break;
            val=z[i];
            pp++;
        }
    }
    if(semn==-1)
        if(val==0)
            val=1;
        else
            val=0;
    return val;
}
int termen(char s[])
{
    int prod=factor(s);
    while(s[pp]=='A')
        if(s[pp]=='A')
        {
            pp++;
            while(s[pp]>='A' && s[pp]<='Z')
                pp++;
            prod&=factor(s);
        }
    return prod;
}
int expresie(char s[])
{
    int sum=termen(s);
    while(s[pp]=='O')
        if(s[pp]=='O')
        {
            pp++;
            while(s[pp]>='A' && s[pp]<='Z')
                pp++;
            sum|=termen(s);
        }
    return sum;
}
int main()
{
    int n,i,k,j,n1,n2;
    char c;
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    n1=0;
    do
    {
        s1[n1++]=getchar();
    }while(s1[n1-1]!='\n');
    for(i=0; i<n1; i++)
        if(s1[i]>='A' && s1[i]<='Z' && (s1[i+1]<'A' || s1[i+1]>'Z') && (s1[i-1]<'A' || s1[i-1]>'Z'))
            f1[s1[i]-'A'+1]=1;
    k=0;
    for(i=1; i<=26; i++)
        if(f1[i]==1)
            v[++k]=i+'A'-1;
    scanf("%d",&n);
    getchar();
    for(j=1; j<=n; j++)
    {
        c=getchar();
        i=1;
        while(v[i]!=c)
            i++;
        if(z[i]==0)
            z[i]=1;
        else
            z[i]=0;
        pp=0;
        printf("%d",expresie(s1));
    }

    return 0;
}