题目
题解
考查STL。
set内部本身自带排序函数,也就是说插入set后通过迭代器或者auto输出的结果都是升序排列的;如果想要改变排序方式,可以自己定义一个cmp结构体,重载set<?>中?的()操作符,比如:
#define PSI pair<string, int>
struct cmp {
bool operator() (const PSI & a, const PSI & b) const {
if (a.second != b.second) return a.second > b.second;
return a.first < b.first;
}
};
set<PSI, cmp> s;
vector自带比较函数,可以直接比较v1与v2,从头开始按顺序比较,v1[i]>v2[i]说明v1>v2。
更新于2022.4.22
发现其实根本不用这么麻烦,只要知道vector是可以自己比较大小是就行了。
用map统计出每种vector的数量;
用个结构体保存,索引就是正常编号,数据项为vector和vector的个数;
再重新遍历输入的每一行,如果遍历过了这个vector,那么就continue,没遍历过就相当于遇到了一个独一无二的vector,结构体编号加一,vector赋值为遍历到的,个数赋值为上面map统计的数量;
遍历完成,sort,重写cmp;
输出。
代码
#include<bits/stdc++.h>
#define VI vector<int>,int
#define PVI pair<VI>
using namespace std;
int n, m, x;
vector <int> v;
struct cmp { // !!!
bool operator() (const PVI & a, const PVI & b) {
if (a.second != b.second) return a.second > b.second;
return a.first < b.first; // vector自带比较大小的函数
}
};
map <VI> Map;
set <PVI, cmp> s; // !!!
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i ++) {
v.clear ();
for (int j = 1;j <= m;j ++)
cin >> x, v.push_back (x);
Map[v] ++;
}
for (auto item : Map) {
v = item.first;
int cnt = item.second;
s.insert ({v, cnt});
}
cout << s.size () << endl;
for (auto item : s) {
v = item.first;
int cnt = item.second;
cout << cnt << ' ' << v[0];
for (int i = 1;i < v.size();i ++)
cout << ' ' << v[i];
cout << endl;
}
return 0;
}
更新后的代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, m, num;
map <vector <int>, int> st, cnt;
vector <int> v[N];
struct Node {
int cnt;
vector <int> v;
} node[N];
bool cmp (Node a, Node b) {
if (a.cnt != b.cnt) return a.cnt > b.cnt;
return a.v < b.v;
}
int main()
{
cin >> n >> m;
for (int i = 0;i < n;i ++) {
for (int j = 0;j < m;j ++) {
int x;
cin >> x;
v[i].push_back (x);
}
cnt[v[i]] ++;
}
for (int i = 0;i < n;i ++) {
if (st[v[i]]) continue;
st[v[i]] = 1;
node[num].cnt = cnt[v[i]];
node[num].v = v[i];
num ++;
}
sort (node, node+num, cmp);
cout << num << endl;
for (int i = 0;i < num;i ++) {
cout << node[i].cnt;
for (int j = 0;j < node[i].v.size();j ++)
cout << ' ' << node[i].v[j];
cout << endl;
}
return 0;
}
这篇博客详细介绍了C++ STL中set和vector的使用,特别是set的自排序特性和如何自定义排序规则。通过定义cmp结构体重载比较操作符,可以改变set中元素的排序方式。同时,文章提到了vector可以直接进行比较,并展示了如何利用map统计vector出现的次数,然后用结构体存储并排序。更新后的代码简化了这一过程,直接利用vector的比较功能进行排序。

394

被折叠的 条评论
为什么被折叠?



