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