CCF-CSP 201912-3 化学方程式

#include <bits/stdc++.h>

using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

void split(string s, vector<string> &v, string c)//分割字符串
{
    size_t pos1, pos2;
    pos2 = s.find(c);
    pos1 = 0;
    while (string::npos != pos2)
    {
        v.push_back(s.substr(pos1, pos2 - pos1));
        pos1 = pos2 + c.size();
        pos2 = s.find(c, pos1);
    }
    if (pos1 != s.length())
        v.push_back(s.substr(pos1));
}

void solve2(string s, map<string, int> &m)//处理以加号为分割的块
{
    stringstream ss;
    ss << s[0];
    for (int i = 1; i < s.length(); i++)
    {
        if (isdigit(s[i]) && !isdigit(s[i - 1]))
            ss << ' ';
        else if (isupper(s[i]))
            ss << ' ';
        else if (s[i] == '(' || s[i] == ')')
            ss << " ";
        ss << s[i];
    }
    string temp;
    vector<string> v;
    vector<pair<string, int>> element;
    vector<int> leftpar;
    while (ss >> temp)
        v.push_back(temp);
    int times = 1;
    if (isdigit(v[0][0]))
        times = stoi(v[0]);
    for (int i = isdigit(v[0][0]) ? 1 : 0; i < v.size(); i++)
    {
        if (isupper(v[i][0]))
        {
            if (i + 1 < v.size() && isdigit(v[i + 1][0]))
            {
                int t = stoi(v[i + 1]);
                element.push_back({v[i], t});
                i++;
            }
            else
            {
                element.push_back({v[i], 1});
            }
        }
        else if (v[i] == "(")
        {
            leftpar.push_back(element.size());
        }
        else if (v[i] == ")")
        {
            if (i + 1 < v.size() && isdigit(v[i + 1][0]))
            {
                int st = leftpar.back();
                int t = stoi(v[i + 1]);
                leftpar.pop_back();
                for (int j = st; j < element.size(); j++)
                {
                    element[j].second *= t;
                }
                i++;
            }
        }
    }
    for (auto &x:element)
    {
        m[x.first] += x.second * times;
    }
}

void solve(string s, map<string, int> &m)//处理左边或右边
{
    vector<string> v;
    split(s, v, "+");
    for (int i = 0; i < v.size(); i++)
        solve2(v[i], m);
}

bool equal(map<string, int> &m1, map<string, int> &m2)
{
    if (m1.size() != m2.size())
        return false;
    for (auto &x:m1)
    {
        if (m2[x.first] != x.second)
            return false;
    }
    return true;
}

int main()
{
    IOS;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        string str;
        cin >> str;
        map<string, int> m1, m2;
        vector<string> part;
        split(str, part, "=");
        solve(part[0], m1);
        solve(part[1], m2);
//        cout<<"m1 :: ";
//        for (auto &x:m1)
//        {
//            cout << x.first << "[" << x.second << "] ";
//        }
//        cout << endl;
//        cout<<"m1 :: ";
//        for (auto &x:m2)
//        {
//            cout << x.first << "[" << x.second << "] ";
//        }
//        cout << endl;
        if (equal(m1, m2))
            cout << "Y" << endl;
        else
            cout << "N" << endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值