全RE求助
查看原帖
全RE求助
267428
Access57楼主2022/8/4 22:42

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";
}
2022/8/4 22:42
加载中...