#include <iostream>
#include <string>
#include <vector>
#include <numeric>
#include <stdexcept>
class Solution {
public:
int calPoints(const std::vector<std::string> &ops)
{
std::vector<int> rounds;
int points;
for (auto &op : ops)
{
if (op == "C")
{
if (rounds.empty())
throw std::out_of_range("Not enough valid rounds!");
rounds.pop_back();
}
else if (op == "D")
{
if (rounds.empty())
throw std::out_of_range("Not enough valid rounds!");
points = rounds.back() * 2;
rounds.push_back(points);
}
else if (op == "+")
{
const std::vector<int>::size_type numRounds = rounds.size();
if (numRounds < 2)
throw std::out_of_range("Not enough valid rounds!");
points = rounds[numRounds-2] + rounds[numRounds-1];
rounds.push_back(points);
}
else
{
points = std::stoi(op);
rounds.push_back(points);
}
}
return std::accumulate(rounds.begin(), rounds.end(), 0);
}
};
int main()
{
Solution s;
std::vector<std::string> ops{"5", "2", "C", "D", "+"};
try {
std::cout << s.calPoints(ops);
}
catch (const std::exception &e) {
std::cerr << e.what();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KCmNsYXNzIFNvbHV0aW9uIHsKcHVibGljOgogICAgaW50IGNhbFBvaW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm9wcykKICAgIHsKICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHJvdW5kczsKICAgICAgICBpbnQgcG9pbnRzOwogICAgCiAgICAgICAgZm9yIChhdXRvICZvcCA6IG9wcykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChvcCA9PSAiQyIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChyb3VuZHMuZW1wdHkoKSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSgiTm90IGVub3VnaCB2YWxpZCByb3VuZHMhIik7CiAgICAKICAgICAgICAgICAgICAgIHJvdW5kcy5wb3BfYmFjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9wID09ICJEIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHJvdW5kcy5lbXB0eSgpKQogICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJOb3QgZW5vdWdoIHZhbGlkIHJvdW5kcyEiKTsKICAgIAogICAgICAgICAgICAgICAgcG9pbnRzID0gcm91bmRzLmJhY2soKSAqIDI7CiAgICAgICAgICAgICAgICByb3VuZHMucHVzaF9iYWNrKHBvaW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAob3AgPT0gIisiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+OjpzaXplX3R5cGUgbnVtUm91bmRzID0gcm91bmRzLnNpemUoKTsKICAgICAgICAgICAgICAgIGlmIChudW1Sb3VuZHMgPCAyKQogICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJOb3QgZW5vdWdoIHZhbGlkIHJvdW5kcyEiKTsKICAgIAogICAgICAgICAgICAgICAgcG9pbnRzID0gcm91bmRzW251bVJvdW5kcy0yXSArIHJvdW5kc1tudW1Sb3VuZHMtMV07CiAgICAgICAgICAgICAgICByb3VuZHMucHVzaF9iYWNrKHBvaW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwb2ludHMgPSBzdGQ6OnN0b2kob3ApOwogICAgICAgICAgICAgICAgcm91bmRzLnB1c2hfYmFjayhwb2ludHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgcmV0dXJuIHN0ZDo6YWNjdW11bGF0ZShyb3VuZHMuYmVnaW4oKSwgcm91bmRzLmVuZCgpLCAwKTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgU29sdXRpb24gczsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvcHN7IjUiLCAiMiIsICJDIiwgIkQiLCAiKyJ9OwogICAgdHJ5IHsKICAgICAgICBzdGQ6OmNvdXQgPDwgcy5jYWxQb2ludHMob3BzKTsKICAgIH0KICAgIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgewogICAgICAgIHN0ZDo6Y2VyciA8PCBlLndoYXQoKTsKICAgIH0KICAgIHJldHVybiAwOwp9