Advertisement
YEZAELP

TOI16: PackBot

Nov 24th, 2021
791
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. bool isAlp(char s){
  6.     return 'A' <= s and s <= 'Z';
  7. }
  8.  
  9. int Imp(char a){
  10.     if(a == '1') return 1;
  11.     else if(a == '2') return 2;
  12.     else if(a == '3') return 3;
  13.     else if(a == '[') return 0;
  14. }
  15.  
  16. int Per(int x, char a){
  17.     if(a == '1') return (int)(x * 0.04);
  18.     else if(a == '2') return (int)(x * 0.08);
  19.     else if(a == '3') return (int)(x * 0.16);
  20. }
  21.  
  22. void Debug(stack <int> num, stack <char> opr){
  23.     printf("num : ");
  24.     while(!num.empty()) printf("%d ", num.top()), num.pop();
  25.     printf("\n");
  26.     printf("opr : ");
  27.     while(!opr.empty()) printf("%c ", opr.top()), opr.pop();
  28.     printf("\n\n");
  29. }
  30.  
  31. int main(){
  32.  
  33.     string str;
  34.     cin >> str;
  35.     int len = str.size();
  36.  
  37.     stack <int> num;
  38.     stack <char> opr;
  39.     for(auto s: str){
  40.         //printf("%c\n", s);
  41.         if(s == '['){
  42.             opr.push(s);
  43.         }
  44.         else if(s == ']'){
  45.             while(opr.top() != '['){
  46.                 int a = num.top(); num.pop();
  47.                 int b = num.top(); num.pop();
  48.                 int x = a + b + Per(a + b, opr.top());
  49.                 opr.pop();
  50.                 num.push(x);
  51.             }
  52.             opr.pop();
  53.         }
  54.         else if(isAlp(s)){ /// A B C ... X Y Z
  55.             num.push(20);
  56.         }
  57.         else{ /// 1 2 3
  58.             if(opr.empty() or Imp(s) > Imp(opr.top())) opr.push(s);
  59.             else{
  60.                 while(!opr.empty() and Imp(s) <= Imp(opr.top())){
  61.                     int a = num.top(); num.pop();
  62.                     int b = num.top(); num.pop();
  63.                     int x = a + b + Per(a + b, opr.top());
  64.                     opr.pop();
  65.                     num.push(x);
  66.                 }
  67.                 opr.push(s);
  68.             }
  69.         }
  70.         //Debug(num, opr);
  71.     }
  72.  
  73.     while(!opr.empty()){
  74.         int a = num.top(); num.pop();
  75.         int b = num.top(); num.pop();
  76.         int x = a + b + Per(a + b, opr.top());
  77.         opr.pop();
  78.         num.push(x);
  79.     }
  80.  
  81.     printf("%d", num.top());
  82.  
  83.     return 0;
  84. }
Advertisement
RAW Paste Data Copied
Advertisement