【題解】TIOJ 2051 . 化學元素分析(Chemical Analysis)

【題目敘述】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";
    }
}
分享本文 Share with friends