Nguồn đề bài: http://vn.spoj.com/problems/MMASS/
1. Đề bài MMASS PTIT121E spoj
Hóa chất chỉ gồm các nguyên tố C, H, O có trọng lượng 12,1, 16 tương ứng.
Nó được biểu diễn 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 >=2 và <=9.
Tính khối lượng hóa chất.
Input
Gồm một dòng mô tả hóa chất không quá 100 kí tự chỉ gồm C, H, O, (, ), 2,..,9.
Output
Khối lượng của hóa chất (luôn <=10000).
Example
| INPUT | OUTPUT | 
| COOH | 45 | 
| INPUT | OUTPUT | 
| CH(CO2H)3 | 148 | 
| INPUT | OUTPUT | 
| ((CH)2(OH2H)(C(H))O)3 | 222 | 
2. Gợi ý MMASS PTIT121E spoj
– Ứng dụng stack. xem code mẫu để hiểu rõ hơn
3. Code tham khảo MMASS PTIT121E spoj
const   fi='';
var
        s:string;
        n:longint;
        f:text;
        Stack:array[0..100+50] of longint;
        last,i,tmp,stmp:longint;
function KL(x:char):longint;
begin
        if x='C' then
                exit(12);
        if x='O' then
                exit(16);
        exit(1);
end;
procedure add(x:longint);
begin
        inc(last);
        stack[last]:=x;
end;
function push:longint;
begin
        push:=stack[last];
        dec(last);
end;
begin
        assign(f,fi); reset(f);
        readln(f,s);
        close(f);
        n:=length(s);
        last:=0;
        for i:=1 to n do
                begin
                        if s[i]='(' then
                                begin
                                        add(0);
                                        continue;
                                end;
                        if s[i] in ['C','H','O'] then
                                begin
                                        add(KL(s[i]));
                                        continue;
                                end;
                        if s[i] in ['2'..'9'] then
                                begin
                                        add((ord(s[i])-48)*push);
                                        continue;
                                end;
                        if s[i]=')' then
                                begin
                                        stmp:=0;
                                        while last<>0 do
                                                begin
                                                        tmp:=push;
                                                        if tmp=0 then break;
                                                        stmp:=stmp+tmp;
                                                end;
                                        add(stmp);
                                end;
                end;
        tmp:=0;
        for i:=1 to last do
                inc(tmp,stack[i]);
        writeln(tmp);
end. 
  
  
  
 