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");
}