提交后得100分的C++程序如下:
#include<bits/stdc++.h>
using namespace std;
int n;
string formula;
map<string,int> ans;
int calDigit(int b,int e){ //计算b和e之间的系数
int i=0;
for(;b<=e&&isdigit(formula[b]);b++){
i=i*10+(formula[b]-'0');
}
return i==0? 1:i;
}
void f(int b,int e,int n){ //计算formula的[first,last]区间的原子及其对应的系数
if((b==e)||(e-b==1&&islower(formula[e]))){ //化学式是单个原子
ans[formula.substr(b,e-b+1)]+=n;
return;
}
n*=calDigit(b,e);
for(int i=b,j=i+1;i<=e;i=j,++j){
if(isupper(formula[i])){ //是原子
if(j<=e&&islower(formula[j])) j++;
int k=j;
f(i,k-1,n*calDigit(j,e));//递归
}else if(formula[i]=='('){
for(int num=1;num!=0;j++){
if(formula[j]=='(') num++;
else if(formula[j]==')') num--;
}
int k=j;
f(i+1,k-1,n*calDigit(j,e));//递归处理
}
}
}
void expression(int b,int e,int n){
for(int i=b,j=b;i<=e;i=j+1){
j=formula.find('+',i);
if(j==string::npos||j>e) j=e+1;
f(i,j-1,n);
}
}
int main()
{
cin>>n;
while(n--){
cin>>formula;
ans.clear();
int k=formula.find('=');
expression(0,k-1,1);
expression(k+1,formula.size()-1,-1);
int flag=1;
for(map<string,int>::iterator it=ans.begin();it!=ans.end();it++){
if(it->second!=0){
flag=0;
break;
}
}
if(flag) cout<<"Y"<<"\n";
else cout<<"N"<<"\n";
}
}