Cod sursa(job #129106)

Utilizator tErMyAndrei Panturu tErMy Data 28 ianuarie 2008 17:34:35
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
 #include <stdio.h>  
 #include <string.h>  
 #define NMAX 1001  
   
 char e[NMAX];  
 int N, k, v['Z'-'A'+1];  
   
 int evalf();  
 int evalt();  
 int evale();  
   
 int main() {  
     int i;  
     char c;  
     freopen("bool.in", "r", stdin);  
     freopen("bool.out", "w", stdout);  
     fgets(e, NMAX, stdin);  
     //printf("%d ", strlen(e));  
     scanf("%d\n", &N);  
     for (i = 0; i < N; ++i) {  
         scanf("%c", &c);  
         k = 0, v[c-'A'] = !v[c-'A'];  
         printf("%d", evale());  
     }  
     //printf("%d ", evale());  
     //printf("%d", k);  
     return 0;  
 }  
   
 int evalf() {  
    if (e[k] == '(') {  
         ++k;  
         return evale();  
     }  
     else if (e[k] == 'N' && e[k+1] == 'O') {  
         k += 4;  
         return !evalf();  
     }  
     else if (e[k] == 'T' && e[k+1] == 'R') {  
         k += 4;  
         if (e[k] == ' ')  
             ++k;  
         return 1;  
     }  
     else if (e[k] == 'F' && e[k+1] == 'A') {  
         k += 5;  
         if (e[k] == ' ')  
             ++k;  
         return 0;  
     }  
     else {  
         int r = v[e[k]-'A'];  
         ++k;  
         if (e[k] == ' ')  
             ++k;  
         return r;  
     }  
 }  
 int evalt() {  
     int r = evalf();  
     while (e[k] == 'A' && e[k+1] == 'N') {  
         k += 4;  
         r &= evalf();  
     }  
     return r;  
 }  
 int evale() {  
     int r = evalt();  
     while (e[k] == 'O' && e[k+1] == 'R' && e[k] && e[k] != ')') {  
         k += 3;  
         r |= evalt();  
     }  
     ++k;  
     if (e[k] == ' ')  
         ++k;  
     //printf("%d %d %c\n", k, r, e[k]);  
     return r;  
 }