恶心模拟-化学方程式

题目大意:

 

 思路:

  毫无技术可言的模拟题,水题,但是我还是只过了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);
    }
}

 

posted @ 2020-08-27 20:59  kstranger  阅读(244)  评论(0)    收藏  举报