Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- string expr;
- int eval(int l, int r){
- vector<int> v,op;
- for(int i = l,k = 0,neg = 0,s = -1;i <= r;++i){
- if(expr[i] == '('){
- ++k;
- if(k == 1) s = i;
- }else if(expr[i] == ')'){
- --k;
- if(k == 0){
- v.push_back(neg ^ eval(s + 1,i - 1));
- neg = 0;
- }
- }else if(k == 0){
- if(expr[i] == '!'){
- int e = i;
- while(expr[e] == '!') ++e;
- if((e - i) & 1) neg = 1;
- if(expr[e] != '('){
- if(expr[e] == 'V') v.push_back(neg ^ 1);
- else v.push_back(neg);
- neg = 0;
- }else --e;
- i = e;
- }else if(expr[i] == '&') op.push_back(1);
- else if(expr[i] == '|') op.push_back(0);
- else if(expr[i] == 'V') v.push_back(1);
- else if(expr[i] == 'F') v.push_back(0);
- }
- }
- int ret = 0,n = v.size();
- for(int i = 0;i < n;){
- int aux = v[i];
- int e = i + 1;
- while(e < n && op[e - 1] == 1){
- aux &= v[e];
- ++e;
- }
- ret |= aux;
- i = e;
- }
- return ret;
- }
- int main(){
- ios::sync_with_stdio(0);
- string line;
- int tc = 1;
- while(getline(cin,line)){
- int L = line.size();
- expr.clear();
- for(int i = 0;i < L;++i)
- if(line[i] != ' ')
- expr += line[i];
- if(expr.empty()) break;
- int ret = eval(0,expr.size() - 1);
- cout << "Expression " << tc++ << ": " << (ret? 'V' : 'F') << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement