201912-3 化学方程式

试题编号: 201912-3
试题名称: 化学方程式
时间限制: 1.0s
内存限制: 512.0MB
201912-3 化学方程式_第1张图片201912-3 化学方程式_第2张图片201912-3 化学方程式_第3张图片
前四个测试点还是很好写的,不过加入小写字母要注意Cu+As=Cs+Au这种情况,不能只是判断字符种类的数目是否相同

#include
#include
#include
#include
using namespace std;
const int N=30;
int pos;
int cnt[N],cntd[N][N];
int num(string &s)
{
	int t=0;
	while(isdigit(s[pos]))
	{
		t=t*10+(s[pos]-'0');
		pos++;
	}
	return t;
}
void count(string &s,int d)
{
	int len=s.size();
	pos=0;
	if(isdigit(s[0])) d*=num(s);
	while(pos<len)
	{
		if(isdigit(s[pos]))
		{
			int post=pos-1;
			int dd=num(s);
			if(islower(s[post]))
			{
				cntd[s[post-1]-'A'][s[post]-'a']+=d*(dd-1);
			}
			else
			{
				cnt[s[post]-'A']+=d*(dd-1);
			}
		}
		else if(islower(s[pos]))
		{
			cnt[s[pos-1]-'A']-=d;
			cntd[s[pos-1]-'A'][s[pos]-'a']+=d;
			pos++;
		}
		else if(isupper(s[pos]))
		{
			cnt[s[pos]-'A']+=d;
			pos++;
		}
		else if(s[pos]=='(')
		{
			int posr=s.find(')',pos),tt,dd=1;
			string sub=s.substr(pos+1,posr-pos-1);
			if(isdigit(s[posr+1]))
			{
				pos=posr+1;
				dd=num(s);
				tt=pos;
			}
			else tt=posr+1;
			count(sub,dd*d);
			pos=tt;
		}
	}
}
void sep(string &s,int d)
{
	int pos1=0,pos2=s.find('+');
	string sub;
	while(pos2!=-1)
	{
		sub=s.substr(pos1,pos2-pos1);
		count(sub,d);
		pos1=pos2+1;
		pos2=s.find('+',pos1);
	}
	sub=s.substr(pos1);
	count(sub,d);
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		memset(cnt,0,sizeof cnt);
		memset(cntd,0,sizeof cntd);
		string s,sl,sr;
		cin>>s;
		int pos=s.find('=');
		sl=s.substr(0,pos);
		sr=s.substr(pos+1);
		sep(sl,1);
		sep(sr,-1);
		bool flag=true;
		for(int i=0;i<N;i++)
		{
			if(cnt[i]!=0)
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			for(int i=0;i<N;i++)
			for(int j=0;j<N;j++)
			{
				if(cntd[i][j]!=0)
				{
					flag=false;
					break;
				}
			}
			if(flag) cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
		else cout<<"N"<<endl;
	}
	return 0;
}
/*
10
H2+O2=H2O
2H2+O2=2H2O
H2+2Cl=2NaCl
H2+2Cl=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
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
Cu+As=Cs+Au
*/

个人觉得圆括号的嵌套性价比是在不高,所以就没考虑嵌套情况,代码只有80分。。。

你可能感兴趣的:(csp)