NC219040. 相对分子质量
描述
输入描述
第一行中给出两个正整数
接下来M行每行给出一个以大写字母开头的字符串S和一个正整数X,S为元素名称,X为相对原子质量,
最后N行每行给出一个化学式,保证化学式长度不超过50个字符
元素可能是一个大写字母,也可能是一个大写字母跟着一个小写字母,保证给出的M种化学元素互不相同
化学式包含括号以及括号嵌套,例如:Ba((OH)2(CO3)2)3
注:保证化学式使用给出的元素符号,但不保证该物质真实存在
输出描述
输出N行,每行一个相对分子质量,数据保证相对分子质量在long long范围内
示例1
输入:
2 2 H 1 O 16 H2 H2O
输出:
2 18
C++ 解法, 执行用时: 4ms, 内存消耗: 296K, 提交时间: 2022-04-22 12:42:04
#include<bits/stdc++.h> using namespace std; typedef long long ll; map<string,ll>mp; stack<ll>st; int main() { ll n,m,k; string s; cin>>m>>n; for(ll i=1;i<=m;i++) { cin>>s>>k; mp[s]=k; } while(n--) { cin>>s; ll n=s.size(); string t; for(ll i=0;i<n;i++) { if(s[i]=='(')st.push(-1); else if(s[i]==')') { ll x=0; while(st.top()!=-1)x+=st.top(),st.pop(); st.pop(); st.push(x); } else if(s[i]>='0'&&s[i]<='9') { ll x=0; bool fff=0; while(s[i]>='0'&&s[i]<='9')x=x*10+s[i++]-'0',fff=1; ll y=st.top(); st.pop(); st.push(y*x); i-=fff; } else { t=s[i]; i++; while(islower(s[i])&&i<n)t+=s[i++]; i--; st.push(mp[t]); } } ll x=0; while(st.size())x+=st.top(),st.pop(); cout<<x<<'\n'; } return 0; }
pypy3 解法, 执行用时: 83ms, 内存消耗: 25884K, 提交时间: 2021-09-21 14:15:27
m, n = map(int, input().split()) dic = {} for i in range(m): key, val = input().split() dic[key] = val for i in range(n): s = input() ss = "" j = 0 while j < len(s): if j != len(s) - 1 and s[j:j + 2] in dic: ss += dic[s[j:j + 2]] ss += '+' j += 1 elif s[j] in dic: ss += dic[s[j]] ss += '+' elif s[j].isdigit(): ss += '*' while j < len(s) and s[j].isdigit(): ss += s[j] j += 1 ss += '+' continue else: ss += s[j] j += 1 ss = ss.replace("+*", "*") ss = ss.replace("*)", ")") ss = ss.replace("+)", ")") if ss[-1] == '+': ss = ss[:-1] print(eval(ss))
Python3(3.9) 解法, 执行用时: 17ms, 内存消耗: 2808K, 提交时间: 2021-03-22 17:25:44
m, n = map(int, input().split()) dic = {} for i in range(m): key, val = input().split() dic[key] = val for i in range(n): s = input() st = "" j = 0 while j < len(s): if j != len(s)-1 and s[j:j+2] in dic: st += dic[s[j:j+2]] st += '+' j += 1 elif s[j] in dic: st += dic[s[j]] st += '+' elif s[j].isdigit(): st += '*' while j < len(s) and s[j].isdigit(): st += s[j] j += 1 st += '+' continue else: st += s[j] j += 1 st = st.replace("+*", "*") st = st.replace("*)", ")") st = st.replace("+)", ")") if st[-1] == '+': st = st[:-1] print(eval(st))