Code:
#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
void Init()
{
mp["H"]=1;mp["C"]=12;mp["N"]=14;mp["O"]=16;mp["F"]=19;
mp["Na"]=23;mp["Mg"]=24;mp["Al"]=27;mp["Si"]=28;
mp["P"]=31;mp["S"]=32;mp["Cl"]=35;mp["K"]=39;
mp["Ca"]=40;mp["Mn"]=55;mp["Fe"]=56;mp["Cu"]=64;
mp["Zn"]=65;mp["Ag"]=108;mp["I"]=127;mp["Ba"]=137;
mp["Hf"]=178;mp["Pt"]=195;mp["Au"]=197;mp["Hg"]=201;
}
int get(string str,int &base,int &pd)
{
base=0,pd=0;
int pret=0,pred=0,prefix=0;
string temp;
for(int i=0;i<str.size();i++)
if(str[i]>='A'&&str[i]<='Z')
{
base+=pret,pd+=pred,pret=pred=0,temp="";
temp+=str[i];
if(str[i+1]>='a'&&str[i+1]<='z') temp+=str[i+1],i++;
if(temp=="Cl"||temp=="Hf") pred++;
pret=mp[temp];
}
else if(str[i]=='(')
{
base+=pret,pd+=pred,pret=pred=0,temp="";
while(str[++i]!=')') temp+=str[i];
get(temp,pret,pred);
}
else if(str[i]=='_')
{
i+=2,prefix=0;
while(str[i]!='}') prefix*=10,prefix+=str[i]-'0',i++;
pret*=prefix,pred*=prefix;
}
else if(str[i]>='0'&&str[i]<='9')
{
prefix=0,base+=pret,pd+=pred,pret=pred=0,temp="";
while(str[i]>='0'&&str[i]<='9') prefix*=10,prefix+=str[i]-'0',i++;
for(;i<str.size()&&str[i]!='~';i++) temp+=str[i];
get(temp,pret,pred);
pret*=prefix,pred*=prefix;
}
base+=pret,pd+=pred;
}
int main()
{
Init();
int base=0,pd=0;
string s;
cin>>s;
get(s,base,pd);
base+=pd/2,pd%=2;
cout<<base;
if(pd) cout<<".5";
}