Cod sursa(job #878954)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 14 februarie 2013 20:54:11
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

const int sigma= 26;
const int nmax= 100, lmax= 1000;

char v[lmax+2];
char ch[nmax+2];

bool b[sigma];

int m, ind;

void inc(int x){
    for (ind+= x; /*ind<m&& */v[ind]==' '; ++ind){
    }
}

inline bool op_or(){
    if (ind+1<m&& v[ind]=='O'&& v[ind+1]=='R'){
        inc(2);
        return 1;
    }else{
        return 0;
    }
}

inline bool op_and(){
    printf("%d %d\n", ind, m);
    if (ind+2<m&& v[ind]=='A'&& v[ind+1]=='N'/*&& v[ind+2]=='D'*/){
        inc(3);
        printf("*****");
        return 1;
    }else{
        return 0;
    }
}

inline bool op_not(){
    if (/*ind+2<m&& */v[ind]=='N'&& v[ind+1]=='O'/*&& v[ind+2]=='T'*/){
        inc(3);
        return 1;
    }else{
        return 0;
    }
}

inline bool op_true(){
    if (/*ind+3<m&& */v[ind]=='T'&& v[ind+1]=='R'/*&& 
        v[ind+2]=='U'&& v[ind+3]=='E'*/){
        inc(4);
        return 1;
    }else{
        return 0;
    }
}

inline bool op_false(){
    if (/*ind+4<m&& */v[ind]=='F'&& v[ind+1]=='A'/*&& 
        v[ind+2]=='L'&& v[ind+3]=='S'&& v[ind+4]=='E'*/){
       
        inc(5);
        return 1;
    }else{
        return 0;
    }
}

bool term(), expr_and(), expr_or();

bool term(){
    printf("222\n");
    if (v[ind]=='('){
        inc(1);
        bool x= expr_or();
        printf("2->-1");
        inc(1);
        return x;
    }else if (op_not()){
        bool x= !term();
        printf("2->-2");
        return x;
    }else if (op_true()){
        return 1;
        printf("2->-3");
    }else if (op_false()){
        printf("2->-4");
        return 0;
    }else{
        bool x= b[v[ind]-'A'];
        inc(1);
        printf("2->%d\n", x);
        return x;
    }
}

bool expr_and(){
    printf("&&&\n");
    bool x= term();
    while (op_and()){
        printf("&\n");
        x&= term();
    }
    printf("1->%d\n", x);
    return x;
}

bool expr_or(){
    printf("|||\n");
    bool x= expr_and();
    while (op_or()){
        printf("|\n");
        x|= expr_and();
    }
    printf("0->%d\n", x);
    return x;
}

int main(){
    fin.getline(v, lmax+2);
    int n;
    fin>>n;
    fin.getline(ch, 2);
    fin.getline(ch, nmax+2);
    for (m= 0; m<=lmax&& v[m]!=0; ++m){
    }

    for (int i= 0; i<n; ++i){
        b[ch[i]-'A']^= 1;
        ind= 0;
        fout<<expr_or();        
        printf("\n");
    }
    fout<<"\n";

    return 0;
}