Cod sursa(job #1523144)

Utilizator dyanagGrigore Diana dyanag Data 12 noiembrie 2015 13:47:21
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<cstdio>
#include<cstring>
using namespace std;

FILE *f=fopen("bool.in", "r");
FILE *g=fopen("bool.out", "w");

char initial[1005], litere[105], s[1005];
int n, valoare[30], poz;

void elimin_and_or_not(){
    char ss[7][5], *p, ch[]={0, '&', '|', '!', '1', '0'};
    strcpy(ss[1], "AND");
    strcpy(ss[2], "OR");
    strcpy(ss[3], "NOT");
    strcpy(ss[4], "TRUE");
    strcpy(ss[5], "FALSE");
    p=strchr(initial, ' ');
    while(p!=NULL){
        strcpy(p, p+1);
        p=strchr(initial, ' ');
    }
    for(int i=1; i<=5; ++i){
        p=strstr(initial, ss[i]);
        while(p!=NULL){
            strcpy(p, p+strlen(ss[i])-1);
            initial[p-initial]=ch[i];
            p=strstr(initial, ss[i]);
        }
    }
}

void schimba_litere(){
    strcpy(s, initial);
    int n=strlen(s);
    for(int i=0; i<n; ++i)
        if('A'<=s[i]&&s[i]<='Z')
            s[i]=valoare[s[i]-'A']+'0';
}
int f4(); //VAl
int f3(); //NOT
int f2(); //AND
int f1(){ //OR
    int r=f2(), p;
    while(s[poz]=='|'){
        ++poz;
        p=f2();
        r=r|p;
    }
    return r;
}
int f2(){ //And
    int r=f3(), p;
    while(s[poz]=='&'){
        ++poz;
        p=f2();
        r=r&p;
    }
    return r;
}
int f3(){//NOT
    int r;
    if(s[poz]=='!'){
        ++poz;
        r=f4();
        r=(r+1)%2;
    }
    else
        r=f4();
    return r;
}
int f4(){
    int r;
    if(s[poz]=='('){
        ++poz;
        r=f1();
        ++poz;
        return r;
    }
    r=s[poz]-'0';
    ++poz;
    return r;
}
int main()
{
    fgets(initial, 1001, f);
    fscanf(f, "%d%s", &n, litere);
    elimin_and_or_not();
    //fprintf(g, "%s", initial);
    schimba_litere();
    //fprintf(g, "%s", s);
    for(int i=0; i<n; ++i){
        valoare[litere[i]-'A']=(valoare[litere[i]-'A']+1)%2;
        schimba_litere();
        //fprintf(g, "%c: %s", litere[i], s);
        fprintf(g, "%d", f1());
        poz=0;
    }
return 0;
}