记录编号 56385 评测结果 AAAAA
题目名称 相对分子质量 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2013-03-28 21:38:08 内存使用 0.39 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<deque>
#include<cstring>
#include<iomanip>
using namespace std;
double Ar1[100]={0};//一个字母的原子的相对原子质量
double Ar2[10000]={0};//两个字母的原子的相对原子质量
//哈希,一个字母的就是字母编号,两个字母的,第一个*100+第二个
string s;
deque<double> stn;//存放计算出来的数据
deque<char> stb;//存放括号
void read(void){
	string str="\0";
	double r;
	int l;
	while(1){
		cin>>str;
		if(str=="END_OF_FIRST_PART") break;
		getchar();
		scanf("%lf",&r);
		l=str.size();
		if(l==3){
			cout<<"居然有三个字母的....节操呢"<<endl;
			return;
		}
		if(l==1){
			Ar1[str[0]-'A']=r;
		}
		else{
			Ar2[100*(str[0]-'A')+str[1]-'a']=r;
		}
	}
}
double getm(string str){//得到str元素的相对原子质量
	int temp;
	if(str.size()==1){
		temp=str[0]-'A';
		if(Ar1[temp]!=0) return Ar1[temp];
		else return -1;
		//return Ar1[str[0]-'A'];
	}
	temp=100*(str[0]-'A')+str[1]-'a';
	if(Ar2[temp]!=0) return Ar2[temp];
	else return -1;
	//rAr2[100*(str[0]-'A')+str[1]-'a'];
}
string getatom(int &i){
	string ans="\0";
	ans+=s[i];
	int len=s.size();
	while(i+1<len&&'a'<=s[i+1]&&s[i+1]<='z'){
		ans+=s[++i];
	}
	//指向最后一个小写字母
	//i++;
	return ans;
}
int getnum(int &i){
	//cout<<s[i]<<endl;
	int ans=0;
	int len=s.size();
	while(i+1<len&&'0'<=s[i+1]&&s[i+1]<='9'){
		ans*=10;
		ans+=s[++i]-'0';
	}
	//指向最后一个数字
	//i++;
	//cout<<ans<<endl;
	return (ans==0)?1:ans;
}
void calc(void){
	stn.clear(),stb.clear();
	int len=s.size();
	int i=0;
	string now;
	double temp;
	int num;
	while(i<len){
		if(s[i]=='('){
			stb.push_back(')');
			stn.push_back(0);
			i++;
			goto NEXT;
		}
		if('A'<=s[i]&&s[i]<='Z'){//是字母
			now=getatom(i);
			//i++;
			temp=getm(now);
			if(temp==-1){
				printf("UNKNOWN\n");
				return;
			}
			num=getnum(i);
			//cout<<now<<" "<<num<<endl;
			i++;
			//cout<<s[i]<<endl;
			//cout<<now<<" "<<num<<endl;
			//cout<<temp<<" "<<num<<endl<<endl;
			stn.back()+=temp*(double)num;
			goto NEXT;
		}
		if(s[i]==')'){
			//i++;
			num=getnum(i);
			i++;
			temp=stn.back();
			if(stn.size()>1){
				stn.pop_back(),stb.pop_back();
				stn.back()+=temp*(double)num;
			}
			goto NEXT;
		}
		NEXT:;
	}
	//printf("%lf\n",stn.back());
	cout<<stn.back()<<endl;
}
void work(void){
	string s1;
	while(1){
		s.clear(),s1.clear();
		cin>>s1;
		if(s1=="0") return;
		if(!(s1[0]=='('||('A'<=s1[0]&&s1[0]<='Z'))) return;
		s="("+s1+")";
		//cout<<s<<endl;
		calc();
	}
}
int main(){
	freopen("molecular.in","r",stdin);
	freopen("molecular.out","w",stdout);
	cout<<setiosflags(ios::fixed)<<setprecision(0);
	read();
	work();
	return 0;
}