恶心模拟-化学方程式
题目大意:

思路:
毫无技术可言的模拟题,水题,但是我还是只过了80分,20分不知道是啥情况(嵌套括号自己想的数据都过了,有时间对拍一下)
代码:
#include <iostream> #include <map> #include <cstring> #include <vector> using namespace std; typedef long long ll; map<string,ll> lcnt; map<string,ll> rcnt; map<string,ll> dfs(int& idx,string s){ map<string,ll> res; if(idx>=s.size())return res; string tem=""; if(idx+1<s.size()&&s[idx]>='A'&&s[idx]<='Z'&&s[idx+1]>='a'&&s[idx+1]<='z'){ tem+=s[idx]; idx++; tem+=s[idx]; int ds=0; idx++; while(idx<s.size()&&s[idx]>='0'&&s[idx]<='9'){ ds*=10; ds+=(s[idx]-'0'); idx++; } if(ds==0)ds=1; res[tem]+=ds; map<string,ll> t=dfs(idx,s); for(map<string,ll>::iterator it=t.begin();it!=t.end();it++){ res[it->first]+=it->second; } return res; } else if(s[idx]=='('){ idx++; map<string,ll> t=dfs(idx,s); // cout<<idx<<endl; for(map<string,ll>::iterator it=t.begin();it!=t.end();it++){ res[it->first]+=it->second; } if(s[idx]==')'){ idx++; int ds=0; while(idx<s.size()&&s[idx]>='0'&&s[idx]<='9'){ ds*=10; ds+=s[idx]-'0'; idx++; } if(ds==0)ds=1; for(map<string,ll>::iterator it=res.begin();it!=res.end();it++){ it->second=it->second*ds; } map<string,ll> aft_t=dfs(idx,s); for(map<string,ll>::iterator it=aft_t.begin();it!=aft_t.end();it++){ res[it->first]+=it->second; } return res; } return res; } else if(s[idx]==')'){ return res; } tem+=s[idx]; idx++; int ds=0; while(idx<s.size()&&s[idx]>='0'&&s[idx]<='9'){ ds*=10; ds+=(s[idx]-'0'); idx++; } if(ds==0)ds=1; res[tem]+=ds; map<string,ll> t=dfs(idx,s); for(map<string,ll>::iterator it=t.begin();it!=t.end();it++){ res[it->first]+=it->second; } return res; } map<string,ll> m_cnt(string s){ int xishu=0; int i=0; while(s[i]>='0'&&s[i]<='9'){ xishu*=10; xishu+=(s[i]-'0'); i++; } if(xishu==0)xishu=1; int j=i; map<string,ll> t_cnt=dfs(j,s); for(map<string,ll>::iterator it=t_cnt.begin();it!=t_cnt.end();it++){ it->second=xishu*it->second; } return t_cnt; } //除了大写字母就是大写字母跟小写字母 bool iseval(vector<string> l,vector<string> r){ lcnt.clear(); rcnt.clear(); for(int i=0;i<l.size();i++){ map<string,ll> t=m_cnt(l[i]); for(map<string,ll>::iterator it=t.begin();it!=t.end();it++){ lcnt[it->first]+=it->second; } } for(int i=0;i<r.size();i++){ map<string,ll> t=m_cnt(r[i]); for(map<string,ll>::iterator it=t.begin();it!=t.end();it++){ rcnt[it->first]+=it->second; } } // for(map<string,ll>::iterator it=rcnt.begin();it!=rcnt.end();it++){ // cout<<it->first<<" "<<it->second<<endl; // // if(rcnt[it->first]!=it->second)return false; // } for(map<string,ll>::iterator it=lcnt.begin();it!=lcnt.end();it++){ // cout<<it->first<<" "<<it->second<<endl; if(rcnt[it->first]!=it->second)return false; } return true; } void slove(string s){ vector<string> left; vector<string> right; int i=0; string tem=""; while(s[i]!='='){ if(s[i]=='+'){ left.push_back(tem); tem=""; i++; continue; } tem+=s[i]; i++; } i++; left.push_back(tem); tem=""; while(i<s.size()){ if(s[i]=='+'){ right.push_back(tem); tem=""; i++; continue; } tem+=s[i]; i++; } right.push_back(tem); if(iseval(left,right))cout<<"Y"<<endl; else cout<<"N"<<endl; } int main(){ int n; cin>>n; while(n--){ string s; cin>>s; slove(s); } }

浙公网安备 33010602011771号