CSP认证201912-3化学方程式题解
题目见官网
思路:
- 通过’='分解方程式为左右两个表达式
- 通过’+‘分解表达式为单个化学式
- 处理化学式
化学式处理分为五个状态,最终分理处单个的原子进行计数,括号内的内容单独计数
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int getLastNum(string &s) {
int num;
int pos = -1;
for (int i=0; i<s.size(); ++i) {
if (s[i] >= '0' && s[i] <= '9') {
pos = i;
break;
}
}
if (pos == -1) {
/*s.erase(0, 1);
s.erase(s.size()-1, 1);*/
return 1;
} else {
num = stoi(s.substr(pos));
//s.erase(0, 1);
s.erase(pos);
return num;
}
}
void countItem(string &s, int num, map<string, long long> &m) {
long long n;
if (s.size()) {
n = getLastNum(s);
m[s] += n*num;
}
}
int getBracketNum(string &s) {
string s1;
int i=s.size()-1, j = s.rfind('(');
int num=1;
vector<int> v;
v.reserve(1000);
while(i > j) {
if (s[i] >='0' && s[i] <= '9') {
s1 = s[i] + s1;
} else if (s[i] == ')'){
if (s1.size() > 0) {
v.push_back( stoi(s1) )