2019年12月ccf csp认证第三题-判断是否配平化学方程式

Posted loganacmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019年12月ccf csp认证第三题-判断是否配平化学方程式相关的知识,希望对你有一定的参考价值。

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
void solve_son(queue<string>&q,int bei,map<string,int>&m)
{
    while(!q.empty())
    {
        string ts = q.front();
        q.pop();
        if(ts=="(")
        {
            int left = 1,right = 0;
            queue<string>tq;
            while(left!=right)
            {
                if(q.front()=="(")
                    left++;
                if(q.front()==")")
                    right++;
                if(left==right)
                    break;
                tq.push(q.front());
                q.pop();
            }
            q.pop();
            stringstream s1;
            string s2 = q.front();
            s1<<s2;
            int beit;
            s1>>beit;
            q.pop();
            solve_son(tq,bei*beit,m);
        }
        else
        {
            stringstream s1;
            string s2 = q.front();
            s1<<s2;
            int beit;
            s1>>beit;
            q.pop();
            m[ts]+= bei*beit;
        }
    }
}
void solve(stack<string>&st,map<string,int>&m)
{
    stack<string>rt;
    while(!st.empty())
    {
        rt.push(st.top());
        st.pop();
    } 
    queue<string>q;
    stringstream s1;
    string s2 = rt.top();
    s1<<s2;
    int bei;
    s1>>bei;
    rt.pop();
    while(rt.size())
    {
        q.push(rt.top());
        rt.pop();
    }
    solve_son(q,bei,m);
}
bool check()
{
    int i;
    map<string,int>mleft;
    map<string,int>mright;
    stack<string>st;
    for(i = 0;s[i]!==;i++)
    {
        if(i==0)
        {
            if(s[i]<=9&&s[i]>=0)
            {
                string t;
                while(s[i]<=9&&s[i]>=0)
                {
                    t+=s[i];
                    i++;
                }
                st.push(t);
            }
            else
                st.push("1");
        }    
        if(s[i]==+||s[i+1]===)
        {
            if(s[i]<=Z&&s[i]>=A)
            {
                string t;
                t+=s[i];
                if((i+1)<s.length()&&s[i+1]<=z&&s[i+1]>=a)
                {
                    t+=s[i+1];
                    i++;
                }    
                st.push(t);
                if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                    st.push("1");
            }        
            else if(s[i]<=9&&s[i]>=0)
            {
                string t;
                t+=s[i];
                while((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0)
                {
                    t+=s[i+1];
                    i++;
                }
                st.push(t);
            }
            else if(s[i]==()
                st.push("(");
            else if(s[i]==))
            {
                st.push(")");
                if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                    st.push("1");
            }    
            solve(st,mleft);
            if(s[i+1]!==)
            {
                if(s[i+1]<=9&&s[i+1]>=0)
                {
                    string t;
                    while(s[i+1]<=9&&s[i+1]>=0)
                    {
                        t+=s[i+1];
                        i++;
                    }
                    st.push(t);
                }
                else
                    st.push("1");
            }
        }    
        else if(s[i]<=Z&&s[i]>=A)
        {
            string t;
            t+=s[i];
            if((i+1)<s.length()&&s[i+1]<=z&&s[i+1]>=a)
            {
                t+=s[i+1];
                i++;
            }    
            st.push(t);
            if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                st.push("1");
        }        
        else if(s[i]<=9&&s[i]>=0)
        {
            string t;
            t+=s[i];
            while((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0)
            {
                t+=s[i+1];
                i++;
            }
            st.push(t);
        }
        else if(s[i]==()
            st.push("(");
        else if(s[i]==))
        {
            st.push(")");
            if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                st.push("1");
        }    
    }
    if(st.size())
        solve(st,mleft);
    /*---------------------------------------------------*/
    for(;i<s.length();i++)
    {
        if(s[i]===)
        {
            i++;
            if(s[i]<=9&&s[i]>=0)
            {
                string t;
                while(s[i]<=9&&s[i]>=0)
                {
                    t+=s[i];
                    i++;
                }
                st.push(t);
            }
            else
                st.push("1");
        }
        if(s[i]==+||(i+1)==s.length())
        {
            if(s[i]<=Z&&s[i]>=A)
            {
                string t;
                t+=s[i];
                if((i+1)<s.length()&&s[i+1]<=z&&s[i+1]>=a)
                {
                    t+=s[i+1];
                    i++;
                }    
                st.push(t);
                if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                    st.push("1");
            }        
            else if(s[i]<=9&&s[i]>=0)
            {
                string t;
                t+=s[i];
                while((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0)
                {
                    t+=s[i+1];
                    i++;
                }
                st.push(t);
            }
            else if(s[i]==()
                st.push("(");
            else if(s[i]==))
            {
                st.push(")");
                if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                    st.push("1");
            }    
            solve(st,mright);
            if((i+1)!=s.length())
            {
                if(s[i+1]<=9&&s[i+1]>=0)
                {
                    string t;
                    while(s[i+1]<=9&&s[i+1]>=0)
                    {
                        t+=s[i+1];
                        i++;
                    }
                    st.push(t);
                }
                else
                    st.push("1");
            }
        }    
        else if(s[i]<=Z&&s[i]>=A)
        {
            string t;
            t+=s[i];
            if((i+1)<s.length()&&s[i+1]<=z&&s[i+1]>=a)
            {
                t+=s[i+1];
                i++;
            }    
            st.push(t);
            if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                st.push("1");
        }        
        else if(s[i]<=9&&s[i]>=0)
        {
            string t;
            t+=s[i];
            while((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0)
            {
                t+=s[i+1];
                i++;
            }
            st.push(t);
        }
        else if(s[i]==()
            st.push("(");
        else if(s[i]==))
        {
            st.push(")");
            if(!((i+1)<s.length()&&s[i+1]<=9&&s[i+1]>=0))
                st.push("1");
        }    
    }
    if(st.size())
        solve(st,mright);
        
    map<string,int>::iterator leftiter;
    map<string,int>::iterator rightiter;
    leftiter = mleft.begin();
    rightiter = mright.begin();
    while(leftiter!=mleft.end()&&rightiter!=mright.end())
    {
        if(leftiter->first!=rightiter->first||leftiter->second!=rightiter->second)
            return false;
        leftiter++;
        rightiter++;
    }
    if(leftiter==mleft.end()&&rightiter==mright.end())
        return true;
    return false;
}
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>s;
        if(check())
            cout<<Y<<endl;
        else
            cout<<N<<endl;
    }
    return 0;
}

这题写了1个多小时,所幸最后这题100分,很多地方没开函数,直接复制了代码,所以代码有点繁杂,有时间再修改一下。

以上是关于2019年12月ccf csp认证第三题-判断是否配平化学方程式的主要内容,如果未能解决你的问题,请参考以下文章

2022 ccf c时间

2020年csp第一轮认证分数线

3192. 出现次数最多的数 13年12月CSP

CCF系列题解--2017年12月第三题 Crontab

CCF系列题解--2017年12月第三题 Crontab

CCF系列题解--2017年12月第三题 Crontab