Advertisement
MarioYC

Selectivo 2 - P4

Sep 2nd, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. string expr;
  7.  
  8. int eval(int l, int r){
  9.     vector<int> v,op;
  10.    
  11.     for(int i = l,k = 0,neg = 0,s = -1;i <= r;++i){
  12.         if(expr[i] == '('){
  13.             ++k;
  14.            
  15.             if(k == 1) s = i;
  16.         }else if(expr[i] == ')'){
  17.             --k;
  18.            
  19.             if(k == 0){
  20.                 v.push_back(neg ^ eval(s + 1,i - 1));
  21.                 neg = 0;
  22.             }
  23.         }else if(k == 0){
  24.             if(expr[i] == '!'){
  25.                 int e = i;
  26.                
  27.                 while(expr[e] == '!') ++e;
  28.                 if((e - i) & 1) neg = 1;
  29.                
  30.                 if(expr[e] != '('){
  31.                     if(expr[e] == 'V') v.push_back(neg ^ 1);
  32.                     else v.push_back(neg);
  33.                    
  34.                     neg = 0;
  35.                 }else --e;
  36.                
  37.                 i = e;
  38.             }else if(expr[i] == '&') op.push_back(1);
  39.             else if(expr[i] == '|') op.push_back(0);
  40.             else if(expr[i] == 'V') v.push_back(1);
  41.             else if(expr[i] == 'F') v.push_back(0);
  42.         }
  43.     }
  44.    
  45.     int ret = 0,n = v.size();
  46.    
  47.     for(int i = 0;i < n;){
  48.         int aux = v[i];
  49.         int e = i + 1;
  50.        
  51.         while(e < n && op[e - 1] == 1){
  52.             aux &= v[e];
  53.             ++e;
  54.         }
  55.        
  56.         ret |= aux;
  57.         i = e;
  58.     }
  59.    
  60.     return ret;
  61. }
  62.  
  63. int main(){
  64.     ios::sync_with_stdio(0);
  65.    
  66.     string line;
  67.     int tc = 1;
  68.    
  69.     while(getline(cin,line)){
  70.         int L = line.size();
  71.         expr.clear();
  72.        
  73.         for(int i = 0;i < L;++i)
  74.             if(line[i] != ' ')
  75.                 expr += line[i];
  76.        
  77.         if(expr.empty()) break;
  78.        
  79.         int ret = eval(0,expr.size() - 1);
  80.        
  81.         cout << "Expression " << tc++ << ": " << (ret? 'V' : 'F') << '\n';
  82.     }
  83.    
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement