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