http://www.elijahqi.win/archives/3808
恶心模拟
#include<bits/stdc++.h>
using namespace std;
map<string,double> MM;
inline void init(){
string A="H";MM[A]=1;
A="C";MM[A]=12;
A="N";MM[A]=14;
A="O";MM[A]=16;
A="F";MM[A]=19;
A="Na";MM[A]=23;
A="Mg";MM[A]=24;
A="Al";MM[A]=27;
A="Si";MM[A]=28;
A="P";MM[A]=31;
A="S";MM[A]=32;
A="Cl";MM[A]=35.5;
A="K";MM[A]=39;
A="Ca";MM[A]=40;
A="Mn";MM[A]=55;
A="Fe";MM[A]=56;
A="Cu";MM[A]=64;
A="Zn";MM[A]=65;
A="Ag";MM[A]=108;
A="I";MM[A]=127;
A="Ba";MM[A]=137;
A="Hf";MM[A]=178.5;
A="Pt";MM[A]=195;
A="Au";MM[A]=197;
A="Hg";MM[A]=201;
}
char s[110];int x,n;double ans;char s1[1];
inline double calc(){
++x;double res=0;
while(s[x]!=')'){double tmp=0,nm=0;
if (s[x+1]>='a'&&s[x+1]<='z'){
s1[0]=s[x];
string aa=s1;s1[0]=s[x+1];
string bb=s1;aa=aa+bb;
tmp=MM[aa];x+=2;
}else{
s1[0]=s[x];
string aa=s1;
tmp=MM[aa];++x;
}
if (s[x]=='_'){
while(s[x]<'0'||s[x]>'9') ++x;
while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;
}else nm=1;res+=tmp*nm;
if (s[x]=='}') ++x;
}++x;return res;
}
int main(){
// freopen("2.in","r",stdin);
scanf("%s",s+1);init();n=strlen(s+1);bool flag=0;
for (x=1;x<=n;){double tmp=0,nm=0;
if (s[x]=='(') tmp=calc();
else{
if (s[x+1]>='a'&&s[x+1]<='z'){
s1[0]=s[x];
string aa=s1;s1[0]=s[x+1];
string bb=s1;aa=aa+bb;
tmp=MM[aa];x+=2;
}else{
s1[0]=s[x];
string aa=s1;
tmp=MM[aa];++x;
}
}
if (s[x]=='_'){
while(s[x]<'0'||s[x]>'9') ++x;
while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;
}else nm=1;ans+=tmp*nm;
if (s[x]=='}') ++x;
if (s[x]=='~') {flag=1;++x;break;}
}double nm=0;
for (;x<=n;){
if (s[x]<='9'&&s[x]>='0'){
while(s[x]<'0'||s[x]>'9') ++x;
while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;break;
}else {nm=1;break;}
}if (flag) ans+=nm*18;
printf("%f\n",ans);
return 0;
}