Cod sursa(job #1076320)

Utilizator teoionescuIonescu Teodor teoionescu Data 10 ianuarie 2014 01:03:44
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int Nmax = 105;
const int Lmax = 1005;
char s[Lmax+5],chn[Nmax+5];
char S[Lmax+5];int len=-1;
int var[30];
int N,p;
int ind(char c){
    return int(c)-'A'+1;
}
bool letter(char& c){
    return ('A'<=c && c<='Z');
}
void better(){
    while(p<strlen(s)){
        if(s[p]=='(') S[++len]=s[p];
        if(s[p]==')') S[++len]=s[p];
        if(letter(s[p])){
            string tmp="";
            while(letter(s[p])) tmp+=s[p++];
            p--;
            if(tmp=="NOT") S[++len]='!';
            if(tmp=="AND") S[++len]='&';
            if(tmp=="OR") S[++len]='|';
            if(tmp=="TRUE") S[++len]='1';
            if(tmp=="FALSE") S[++len]='0';
            if(tmp.size()==1) S[++len]=tmp[0];
        }
        p++;
    }
}
int val();
int expror();
int exprand();
int val(){
    if(letter(S[p])){
        p++;
        return var[ind(S[p-1])];
    }
    if(S[p]=='!'){
        p++;
        return (!val());
    }
    if(S[p]=='('){
       p++;
       return exprand();
    }
}
int expror(){
    int x=val();
    while(S[p]=='|'){
        p++;
        x=x|val();
    }
    return x;
}
int exprand(){
    int x=expror();
    while(S[p]=='&'){
        p++;
        x=x&expror();
    }
    return x;
}
int main(){
    in.getline(s,Lmax);
    in>>N;in.get();
    in.getline(chn,Nmax);
    better();
    for(int i=1;i<=N;i++){
        var[ind(chn[i-1])]=!var[ind(chn[i-1])];
        p=0;
        out<<exprand();
    }
    return 0;
}