C - Dimensions[物理单位运算]

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");
}
posted @ 2020-12-23 20:32  zx0710  阅读(126)  评论(0编辑  收藏  举报