STMASS - Khối lượng phân tử

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Hợp chất hữu cơ chỉ gồm các nguyên tố ~C, H, O~ có khối lượng nguyên tử lần lượt là ~12, 1~ và ~16~.

Người ta viết công thức phân tử của hợp chất hữu cơ ở dạng "nén", ví dụ COOHHH là CO2H3 hay CH(CO2H)(CO2H)(CO2H) là CH(CO2H)3. Nếu ở dạng nén thì số lần lặp là một số ~2 ≤ k ≤ 9~.

Cho công thức phân tử của một hợp chất hữu cơ, hãy tính khối lượng phân tử của nó.

Input

  • Dòng đầu ghi số nguyên ~T~ là số bộ test;
  • ~T~ dòng tiếp theo, mỗi dòng chứa một xâu ký tự biểu diễn công thức phân tử của hợp chất hữu cơ.

Giới hạn:

  • ~1 ≤ T ≤ 1000~; độ dài công thức của mỗi hóa chất không quá ~1000~.

Output

  • Gồm ~T~ dòng, mỗi dòng một số nguyên dương là khối lượng của hợp chất ở test tương ứng.

Sample

Input #1
3
COOH
CH(CO2H)3
((CH)2(OH2H)(CHO))3
Output #1
45
148
222

Problem source: Chuyên Sơn La Online Judge


Bình luận

Please read the guidelines before commenting.



  • 0
    congtyluuthaibao1978  đã bình luận lúc 28, Tháng 11, 2025, 10:39

    include <bits/stdc++.h>

    using namespace std; using ll = long long;

    int getMass(char c) { if (c == 'C') return 12; if (c == 'H') return 1; if (c == 'O') return 16; return 0; }

    int main(){ ios::syncwithstdio(false); cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        string s;
        cin >> s;
        stack<ll> st;
        // Dùng -1 làm sentinel cho '('
        for (int i = 0; i < (int)s.size(); ++i) {
            char c = s[i];
            if (c == '(') {
                st.push(-1);
            } else if (c == 'C' || c == 'H' || c == 'O') {
                st.push(getMass(c));
            } else if (c == ')') {
                ll sum = 0;
                while (!st.empty() && st.top() != -1) {
                    sum += st.top();
                    st.pop();
                }
                if (!st.empty() && st.top() == -1) st.pop(); // bỏ '('
                st.push(sum);
            } else if (isdigit(c)) {
                // nhân nhóm/top gần nhất
                int k = c - '0';
                if (!st.empty()) {
                    ll val = st.top();
                    st.pop();
                    st.push(val * k);
                }
            }
        }
        ll result = 0;
        while (!st.empty()) {
            result += st.top();
            st.pop();
        }
        cout << result << "\n";
    }
    return 0;
    

    }


  • 1
    phucan1402  đã bình luận lúc 12, Tháng 10, 2025, 12:59

    ez peasy

    #include <iostream>
    #include <climits>
    #include <stack>
    #include <algorithm>
    #include <vector>
    using namespace std;
    using ll = long long;
    const int maxn = 1e6;
    void AC() {
        stack<int> st;
        string s; cin >> s;
        for(int i = 0; i < s.size(); i++) {
            char c = s[i];
            if(c == 'H') st.push(1);
            else if(c == 'C') st.push(12);
            else if(c == 'O') st.push(16);
            else if(c == '(') st.push(-1);
            else if(c == ')') {
                int sum = 0;
                while(!st.empty() && st.top() != -1) {
                    sum+=st.top(); st.pop();
                }
                st.pop();
                st.push(sum);
            }
            else if(isdigit(s[i])) {
                int to_multi = st.top(); st.pop();
                int multi = c - '0';
                st.push(to_multi * multi);
            }
        }
        ll sum = 0;
        while(!st.empty()) {
            sum+=st.top();
            st.pop();
        }
        cout << sum << '\n';
    }
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t = 1;
        cin >> t;
        while(t--) {
            AC();
        }
        return 0;
    }
    

  • 0
    0988440189  đã bình luận lúc 21, Tháng 5, 2025, 13:34

    ý tưởng là các bạn tạo stack kiểu nguyên lưu khối lượng các phần tử con bên ngoài dấu() và bên trong ()

    -> gặp chữ cái C , H , O thì lưu tương ứng 12 , 1 , 16 ->gặp dấu ( thì phải lưu -1 như kiểu để đánh dấu để tý tính phần trong ngoặc chỉ cộng đến đoạn -1 thôi -> gặp dấu ) thì tính tổng đỉnh của ngăn xếp ( lấy ra rồi xóa ) + vào 1 thằng temp cho đến khi gặp -1 thì dừng , rồi xóa -1 (đang ở đỉnh ngăn xếp đi và thêm temp vào ) -> gặp số thì lấy thằng ở đỉnh ra nhân với số đấy => xóa đỉnh rồi thêm giá trị vừa nhân vào -> cuối cùng thoát ra vòng duyệt sâu bạn chỉ cần cộng các số trong stack lại với nhau là OKELA -> Đêm nay Mu đá chung kết C2 đấy HEHE