CSP化学方程式题解
生活随笔
收集整理的這篇文章主要介紹了
CSP化学方程式题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CSP化學方程式題解
題目描述
題目分析
本題主要考察棧的應用(也可以采用遞歸的方式,效率低),是一道與編譯原理相關的題目。
首先我采用的是類似于哈希表的方法存儲的元素位置及其數量,當然也可以用stl的map。
然后棧里存的是元素所在位置,進而在遇到相應符號(比如+、)、’\0’)時將對應區間里的數乘以相應的倍數。
最后便是得到各類符號時采取的相應操作,如下所示:
C++源碼
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<stack> using namespace std;enum symbol{nul,sym,number,lp,rp,add,equ}; typedef enum symbol symbol; typedef vector< pair<int,int> > vec; const int MAX=1e3+4;char c[MAX]; int a[2][27*26]={0}; bool ce=0; int ind,num;symbol getsym(int &ind) {symbol symtmp;if(c[ind]=='\0')return nul;if(c[ind]=='+')symtmp=add,ind++;else if(c[ind]=='(')symtmp=lp,ind++;else if(c[ind]==')')symtmp=rp,ind++;else if(c[ind]=='=')symtmp=equ,ind++;else if(c[ind]>='A'&&c[ind]<='Z'){symtmp=sym;num=c[ind++]-'A';if(c[ind]>='a'&&c[ind]<='z')num=(num+1)*26+c[ind++]-'a';}else if(c[ind]>='0'&&c[ind]<='9'){symtmp=number;num=0;while(c[ind]>='0'&&c[ind]<='9'){num*=10;num+=c[ind++]-'0';}}return symtmp; }bool solve() {int now=0,shu=1;bool xuan=0,rpy=1;stack<int> bracket;vec v[2];symbol lsym=add;symbol Sym=getsym(ind);while(Sym){switch(Sym){case sym:v[ce].push_back(make_pair(num,1));break;case lp:bracket.push(v[ce].size());break;case rp:Sym=getsym(ind);if(Sym==number){for(int i=bracket.top();i<v[ce].size();i++)v[ce][i].second*=num;}else{lsym=rp;rpy=0;}bracket.pop();break;case equ:if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}ce=!ce;Sym=add;break;case number:if(lsym!=add)v[ce][v[ce].size()-1].second*=num;else{shu=num;now=v[ce].size();xuan=1;}break;case add:if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}break;}if(rpy){lsym=Sym;Sym=getsym(ind);}else{rpy=1;}}if(xuan){for(int i=now;i<v[ce].size();i++)v[ce][i].second*=shu;xuan=0;}for(int i=0;i<2;i++)for(int j=0;j<v[i].size();j++){a[i][v[i][j].first]+=v[i][j].second;}for(int i=0;i<27*26;i++)if(a[0][i]!=a[1][i]){return false;}return true; }int main() {int e;scanf("%d",&e);while(e--){ce=0;ind=0;memset(a,0,sizeof(a));scanf("%s",c);bool jud=solve();if(jud)puts("Y");elseputs("N");}return 0; }不足之處敬請指正!
總結
以上是生活随笔為你收集整理的CSP化学方程式题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超级爆笑!东北小伙模仿外国人说英语(日韩
- 下一篇: pyspark 数据框 更改大小写_英文