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