CCF认证 201912-3 化学方程式 (100分)
程序员文章站
2023-12-21 18:52:10
...
CCF认证 201912-3 化学方程式 (100分)
差几行代码300的我哭鸟= =
// INFO BEGIN
//
// User = 201911506529(俞梦真)
// Group = C/C++
// Problem = 化学方程式
// Language = CPP11
// SubmitTime = 2019-12-15 16:42:38
//
// INFO END
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
const int maxn=1000+10;
map<string,int> Lm,Rm;
//int Lnum[maxn],Rnum[maxn];
//string Ls[max],Rs[maxn];
//是数字
bool isnum(char c){
if(c<='9'&&c>='0') return 1;
return 0;
}
//小写字母
bool issmall(char c){
if(c<='z'&&c>='a') return 1;
return 0;
}
//大写字母
bool isbig(char c){
if(c<='Z'&&c>='A') return 1;
return 0;
}
void oneword(string str,bool flag,int num){
int len=str.size();
int cnt=1,i=0;
string tmp="";
int tmp1=-1;
while(isnum(str[i])&&i<len){
if(i==0) cnt=str[i]-'0';
else cnt=cnt*10+str[i]-'0';
i++;
}//最前面的系数
cnt=cnt*num;
// cout<<str<<" "<<num<<" "<<cnt<<endl;
for(;i<len;i++){
if(str[i]=='+'&&tmp!=""){
if(tmp1==-1) tmp1=1;
if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
else Rm[tmp]=Rm[tmp]+tmp1*cnt;
tmp1=-1;tmp="";
}
else if(isnum(str[i])){
if(tmp1==-1) tmp1=str[i]-'0';
else tmp1=tmp1*10+str[i]-'0';
}
else if(str[i]=='('){
if(tmp!=""){
if(tmp1==-1) tmp1=1;
if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
else Rm[tmp]=Rm[tmp]+tmp1*cnt;
tmp1=-1;tmp="";//总结一下前面的
}
int x=1;//考试的时候没有加这个对嵌套处理 得分80= =唉 就差几行
for(int j=i+1;j<len;j++){
if(str[j]==')'){
x--;
if(x==0){
i=j+1;break;
}
}
else if(str[j]=='(') x++;//
tmp+=str[j];
}
//加上()后的数字
int tmp2=-1;
while(isnum(str[i])&&i<len){
if(tmp2==-1) tmp2=str[i]-'0';
else tmp2=tmp2*10+str[i]-'0';
i++;
}
if(tmp2==-1) tmp2=1;
oneword(tmp,flag,tmp2*cnt);
i--;// 因为等下还要i++
tmp1=-1;tmp="";//总结一下前面的
}
else {
if(isbig(str[i])&&tmp.size()>0){
if(tmp1==-1) tmp1=1;
if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
else Rm[tmp]=Rm[tmp]+tmp1*cnt;
tmp1=-1;tmp=str[i];
}
else tmp+=str[i];
}
}
//最后一个
if(tmp!=""){
if(tmp1==-1) tmp1=1;
if(!flag) Lm[tmp]=Lm[tmp]+tmp1*cnt;
else Rm[tmp]=Rm[tmp]+tmp1*cnt;
}
}
void find(string str,bool flag){
int len=str.size();
string tmp="";
for(int i=0;i<len;i++){
if(str[i]=='+'){
oneword(tmp,flag,1);
tmp="";
}
else tmp+=str[i];
}
if(tmp!=""){
oneword(tmp,flag,1);
}
}
int main(){
int n;
string str;
cin>>n;
while(n--){
cin>>str;
Lm.clear();
Rm.clear();
int len=str.size();
for(int i=0;i<len;i++){
if(str[i]=='='){
find(str.substr(0,i),0);
find(str.substr(i+1,len),1);
break;
}
}
int flag=0;
for(map<string,int>::iterator it=Lm.begin();it!=Lm.end();it++){
// cout<<it->first<<" "<<it->second<<endl; //
// cout<<Rm[it->first]<<endl;//
if(Rm[it->first]==it->second) Rm[it->first]=0;
else {
flag=1;break;
}
}
for(map<string,int>::iterator it=Rm.begin();it!=Rm.end();it++){
if(it->second!=0) {
// cout<<":"<<it->first<<": "<<it->second<<endl; //
flag=1;break;
}
}
if(!flag) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}
/*
11
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
Cu+As=Cs+Au
*/