3466. 清点代码库
需要求有几种不同数列,每种有多少个,可以想到用map。它的键是一个数列,可以把它放在vector里。也就是map<vector<int>,int>
要满足要求的输出序列,就要想把它放在其他容器,或数组里,进行排序。因为map不能自定义排序,而且既要对值排序,还要对键排序。
我起初是定义了一个结构体(里边是vector和int),也能过,比起用vector<pair<vector<int>,int> >
慢了几十ms。
这里还有一个知识点,两个vector< int > 可以直接比较大小,类似于字典序,在第一个代码中有用到。
代码1
#include<bits/stdc++.h>
using namespace std;
struct ku{vector<int> ss;int t;
}a[10005];
bool cmp(ku a,ku b)
{if(a.t==b.t)return a.ss<b.ss;return a.t>b.t;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin>>n>>m;map<vector<int>,int> k;while(n--){int g;vector<int> v;for(int i=0;i<m;i++){cin>>g;v.push_back(g);}k[v]++;}cout<<k.size()<<'\n';int i=0;for(auto it:k){a[i].ss=it.first;a[i].t=it.second;i++;}sort(a,a+i,cmp);for(int j=0;j<i;j++){cout<<a[j].t;for(auto l:a[j].ss)cout<<" "<<l;cout<<'\n';}}
第二个代码中,将每种的个数y变成相反数,这样对vector可以直接从小到大排,y恰好实现从大到小排,而比较数列时,小的在前。
代码2
#include<bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin>>n>>m;map<vector<int>,int> k;while(n--){int g;vector<int> v;for(int i=0;i<m;i++){cin>>g;v.push_back(g);}k[v]++;}cout<<k.size()<<'\n'; vector< pair < int , vector< int > > > a; for(auto it:k){a.push_back({-it.second,it.first});}sort(a.begin(),a.end());for(auto it:a){cout<<-it.first;for(auto ij:it.second)cout<<" "<<ij;cout<<'\n'; }}