Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <map>
  4. #include <unordered_map>
  5. #include <unordered_set>
  6. #include <vector>
  7. #include <string>
  8. #include <cmath>
  9. #include <random>
  10. #include <algorithm>
  11. #include <stack>
  12. #include <functional>
  13. #include <sstream>
  14. #include <variant>
  15.  
  16. using namespace std;
  17.  
  18. vector<string_view> Split(string_view str, string_view delims = " ")
  19. {
  20. vector<string_view> output;
  21. //output.reserve(str.size() / 2);
  22.  
  23. for (auto first = str.data(), second = str.data(), last = first + str.size(); second != last && first != last; first = second + 1) {
  24. second = find_first_of(first, last, cbegin(delims), cend(delims));
  25.  
  26. if (first != second)
  27. output.emplace_back(first, second - first);
  28. }
  29.  
  30. return output;
  31. }
  32.  
  33. int Sum(int l, int r) {
  34. return l + r;
  35. }
  36.  
  37. int Minus(int l, int r) {
  38. return l - r;
  39. }
  40.  
  41. int Mult(int l, int r) {
  42. return l * r;
  43. }
  44.  
  45. int Div(int l, int r) {
  46. if (r == 0) {
  47. return l;
  48. }
  49.  
  50. return l / r;
  51. }
  52.  
  53. int Less(int l, int r) {
  54. return l < r;
  55. }
  56.  
  57. int Equal(int l, int r) {
  58. return l == r;
  59. }
  60.  
  61. int Greater(int l, int r) {
  62. return l > r;
  63. }
  64.  
  65. int IfOper(int check, int l, int r) {
  66. if (check) {
  67. return l;
  68. }
  69.  
  70. return r;
  71. }
  72.  
  73. int main() {
  74. cin.tie(nullptr);
  75. ios_base::sync_with_stdio(false);
  76. unordered_map<char, function<int(int, int)>> bind = {
  77. {'+', Sum}
  78. , {'-', Minus}
  79. , {'*', Mult}
  80. , {'/', Div}
  81. , {'<', Less}
  82. , {'=', Equal}
  83. , {'>', Greater}
  84. };
  85.  
  86. size_t N = 0;
  87. cin >> N;
  88.  
  89. string dummy;
  90. string input;
  91. getline(cin, dummy);
  92. getline(cin, input);
  93.  
  94. vector<string_view> strs = Split(input);
  95.  
  96. vector<variant<char, int>> vars;
  97. vars.reserve(strs.size());
  98. for (auto& str: strs) {
  99. if (('0' <= str[0] && str[0] <= '9') || (str.size() > 1 && '0' <= str[1] && str[1] <= '9')) {
  100. vars.emplace_back((int)stoi(string(str)));
  101. } else {
  102. vars.emplace_back((char)str[0]);
  103. }
  104. }
  105. vector<int> params(N);
  106.  
  107. size_t T = 0;
  108. cin >> T;
  109. for (size_t i = 0; i < T; ++i) {
  110. for (size_t j = 0; j < N; ++j) {
  111. cin >> params[j];
  112. }
  113.  
  114. stack<int> nums;
  115. for (auto& var: vars) {
  116. if (holds_alternative<int>(var)) {
  117. nums.push(get<int>(var));
  118. } else {
  119. char symb = get<char>(var);
  120. if (isalpha(symb)) {
  121. nums.push(params[symb - 'a']);
  122. } else {
  123. int r = nums.top();
  124. nums.pop();
  125. int l = nums.top();
  126. nums.pop();
  127.  
  128. if (symb == '?') {
  129. int check = nums.top();
  130. nums.pop();
  131. nums.push(IfOper(check, l, r));
  132. } else {
  133. nums.push(bind[symb](l, r));
  134. }
  135. }
  136. }
  137. }
  138.  
  139. if (nums.empty()) {
  140. cout << 0 << '\n';
  141. } else {
  142. cout << nums.top() << '\n';
  143. }
  144.  
  145. }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement