欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CCF认证 201912-3 化学方程式 (100分)

程序员文章站 2023-12-21 18:52:10
...

CCF认证 201912-3 化学方程式 (100分)

差几行代码300的我哭鸟= =CCF认证 201912-3 化学方程式 (100分)

 

CCF认证 201912-3 化学方程式 (100分)

// 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
*/

 

相关标签: ccf认证

上一篇:

下一篇: