【題目敘述】https://tioj.ck.tp.edu.tw/problems/2051
#include <iostream>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
int tmp, a[260], nxt_i;
string s, str;
stack <int> stk;
map <string, int> mp;
set <string> st;
int main() {
cin >> s;
nxt_i = s.length();
for (int i = 0; i < s.length(); i++){
if (s[i] == '(') stk.push(i);
else if (s[i] == ')'){
tmp = 0;
for (int j = i+1; j < s.length(); j++){
if (s[j]-'0' >= 0 && s[j]-'0' <= 9){
tmp *= 10;
tmp += s[j]-'0';
}
else{
nxt_i = j-1;
break;
}
}
if (tmp > 1){
for (int j = stk.top()+1; j < i; j++){
a[j] *= tmp;
}
stk.pop();
}
i = nxt_i;
nxt_i = s.length();
}
else if ('0' <= s[i] && s[i] <= '9'){
tmp = 0;
for (int j = i; j < s.length(); j++){
if ('0' <= s[j] && s[j] <= '9'){
tmp *= 10;
tmp += s[j]-'0';
}
else{
nxt_i = j-1;
break;
}
}
a[i-1] *= tmp;
i = nxt_i;
nxt_i = s.length();
}
else a[i] = 1;
}
for (int i = 0; i < s.length(); i++){
if ('A' <= s[i] && s[i] <= 'Z'){
str = s[i];
if (i+1 < s.length() && 'a' <= s[i+1] && s[i+1] <= 'z'){
str += s[i+1];
mp[str] += max(a[i], a[i+1]);
}
else mp[str] += a[i];
st.insert(str);
}
}
cout << s << "\n";
for (set<string> :: iterator it = st.begin(); it != st.end(); it++){
cout << *it << ":" << mp[*it] << "\n";
}
}