Cod sursa(job #1035272)

Utilizator hevelebalazshevele balazs hevelebalazs Data 18 noiembrie 2013 14:29:35
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#include <string.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 100
#define M 1000
char s[M+1];
int treel[N*M],treer[N*M],treeo[N*M];
int l,n,tlast=-1;
bool v[26];
int evaluate(int l,int r){
    int tthis=++tlast;
    if(s[l]==' ')++l;
    if(s[r-1]==' ')--r;
    while(s[l]=='('&&s[r-1]==')'){
            int o=0,p=0;
            fr(i,l+1,r-1){
                if(s[i]=='(')++o;
                else if(s[i]==')')--o;
                if(o)p=1;
                if(o==-1)break;
                }
            if(o==-1)break;
            ++l,--r;
            if(!p)break;
        }
    int prio=-1;
    int ln,rn;
    fr(i,l,r){
        if(s[i]==' '){}
        else if(s[i]=='('){
            int o=1;
            while(o){
                if(s[++i]=='(')++o;
                else if(s[i]==')')--o;
                }
            }
        else{
            if(i+1<r&&s[i]=='O'&&s[i+1]=='R') prio=2,ln=i,rn=i+2;
            else if(i+2<r&&s[i]=='A'&&s[i+1]=='N'&&prio<2) prio=1,ln=i,rn=i+3;
            else if(i+3<r&&s[i]=='N'&&s[i+1]=='O'&&prio<1) prio=0,ln=i,rn=i+4;
            }
        }
    if(prio==-1){
        if(l+1==r)prio=5+s[l]-'A';
        else if(s[l]=='T'&&s[l+1]=='R')prio=3;
        else prio=4;
        }
    treeo[tthis]=prio;
    if(prio<3)treer[tthis]=evaluate(rn,r);
    if(prio&&prio<3)treel[tthis]=evaluate(l,ln);
    return tthis;
    }
bool evaltree(int i){
    switch(treeo[i]){
        case 0:return !evaltree(treer[i]);
        case 1:return evaltree(treel[i])&&evaltree(treer[i]);
        case 2:return evaltree(treel[i])||evaltree(treer[i]);
        case 3:return true;
        case 4:return false;
        default: return v[treeo[i]-5];
        }
    }
int main(){
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    scanf("%[^\n]s",s);
    l=strlen(s);
    evaluate(0,l);
    scanf("%i\n",&n);
    char c;
    fr(i,0,n){
        scanf("%c",&c);
        v[c-'A']=!v[c-'A'];
        //printf("v[%c]=%i\n",c,v[c-'A']);
        printf("%i",evaltree(0));
        }
    return 0;
    }