B3982 [信息与未来 2024] 数据排序 题解
整点烂活。
因为我们不知道表格的每一列是整数还是字符串,所以我们可以用 std::variant<int,std::string>(需要 C++17,作用为存储一个整数或字符串)来存储表格中的元素。
把所有条件都存储在一个 std::vector 里面。因为如果条件都一样要保持原来的顺序,所以使用 std::stable_sort 进行排序,cmp 函数里当所有条件都一样时就返回 false 即可。
放代码:
#include<bits/stdc++.h>
using namespace std;
inline vector<variant<int,string> > f(string s){
vector<variant<int,string> > a;
for(int i=0,j;i<s.length();i=j+1){
string t;
for(j=i;j<s.length()&&s[j]!=',';j++)t+=s[j];
bool D=true; // 是否全是数字
for(char i:t)D&=isdigit(i);
if(D)a.emplace_back(stoi(t));
else a.emplace_back(t);
}
return a;
} // 对输入的字符串进行解析
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; string h; cin>>n>>h;
auto H=f(h);
vector<string> t(n-1);
for(auto &i:t)cin>>i;
vector<vector<variant<int,string> > > T(n-1);
for(int i=0;i<n-1;i++)T[i]=f(t[i]);
vector<pair<int,int> > C;
int m; cin>>m;
for(int i=0;i<m;i++){
string s; cin>>s;
for(int j=0;j<H.size();j++)
if(s.substr(0,s.length()-1)==get<string>(H[j])){
C.emplace_back(j,s.back()=='+'); break;
} // 判断是什么类型的条件
}
stable_sort(T.begin(),T.end(),[&](auto x,auto y){
for(auto [a,s]:C)
if(x[a]!=y[a])return s?x[a]<y[a]:x[a]>y[a];
return false;
}); // 进行排序
cout<<h<<endl;
for(auto x:T)
for(int j=0;j<x.size();j++){
if(get_if<int>(&x[j]))x[j]=to_string(get<int>(x[j]));
cout<<get<string>(x[j])<<",\n"[j==x.size()-1];
}
return 0;
}