zoukankan      html  css  js  c++  java
  • C

    C - Dimensions

    题意:模拟物理单位运算化简,然后分成分子分母排序后输出

    注意点:(1)符号重载,且它给的序列有一个c的符号错了

    (2)如果分子或分母无输出1

    (3)纯粹是我个人的问题,要考虑单位反复出现,例如kg*kg

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+5;
    #define debug(x) cout<<#x<<':'<<x<<endl;
    int dp[maxn];
    string s;
    #define check(c) ((c<='Z'&&c>='A')||(c<='z'&&c>='a'))
    vector<string>vc;
    vector<string >G[2];
    map<string,int>mp;
    map<char,int>mp2;
    bool cmp(string  c1,string  c2){
        for(int i=0;i<min(c1.length(),c2.length());i++)
            if(c1[i]!=c2[i]) return mp2[c1[i]]<mp2[c2[i]];
        return c1.length()<c2.length();
    }
    void dfs(int l,int r,int op)
    {
        string temp=""; int tempop=op;
        for(int i=l;i<r;i++)
        {
            if(check(s[i])) temp+=s[i];
            else if(s[i]=='(') {dfs(i+1,dp[i]+1,tempop);i=dp[i];}
            else if(s[i]==')'){
                // debug(temp);
                vc.push_back(temp);
                if(tempop>0)mp[temp]++;
                else mp[temp]--;
                temp="";
            }
            else if(s[i]=='/'){
                // debug(temp);
                vc.push_back(temp);
                if(tempop>0) mp[temp]++;
                else mp[temp]--;
                tempop=-1*op;temp="";
            }
            else if(s[i]=='*'){
                //debug(temp);
                vc.push_back(temp);
                if(tempop>0) mp[temp]++;
                else mp[temp]--;
                tempop=op;temp="";
            }
        }
    }
    int main()
    {
        string ss="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
        for(int i=0;i<ss.length();i++){
            mp2[ss[i]]=i;
        }
        cin>>s;
        s+='*';
        int t=0;
        stack<int>k;
        for(int i=s.length()-1;i>=0;i--)
        {
            if(s[i]==')') k.push(i);
            else if(s[i]=='(') {dp[i]=k.top();k.pop();}
        }
        // for(int i=0;i<s.length();i++){cout<<dp[i]<<endl;}
        dfs(0,s.length(),1);
        sort(vc.begin(),vc.end(),cmp);
        vc.erase(unique(vc.begin(),vc.end()),vc.end());
        for(int i=0;i<vc.size();i++) 
        {
            while(mp[vc[i]]<0&&vc[i]!="") {G[1].push_back(vc[i]);mp[vc[i]]++;}
            while(mp[vc[i]]>0&&vc[i]!=""){G[0].push_back(vc[i]);mp[vc[i]]--;}
        }
        if(G[1].size()==0) G[1].push_back("1");
        if(G[0].size()==0) G[0].push_back("1");
        for(int i=0;i<G[0].size();i++)
        {
            if(t!=0) cout<<"*";
            cout<<G[0][i];t++;
        }
        cout<<endl;t=0;
        for(int i=0;i<G[1].size();i++)
        {
            if(t!=0) cout<<"*";
            cout<<G[1][i];
            t++;
        }
        
      // system("pause");
    }
    
  • 相关阅读:
    双击返回 退出程序
    读取InputStream 中的内容
    wsgi服务器
    python 中的GIL
    json
    __getattr__
    错误类型
    __slot__用法
    获取属性以及基本方法
    linux IO
  • 原文地址:https://www.cnblogs.com/zx0710/p/14180909.html
Copyright © 2011-2022 走看看