题目详情 - L2-039 清点代码库 (25 分) (pintia.cn)
这就是一道纯stl题,用map存数组(不能是字符串,因为有负数)。然后用vector转存map,进行按值排序。无脑用函数就行了
Code Segment:
#include<cstdio>
#include<vector>
#include<map>
#include<utility>
#include<algorithm>
using namespace std;
int cmp(const pair<vector<int>,int> &a,const pair<vector<int>,int> &b)
{
if(a.second==b.second)
{
auto j=b.first.begin();
for(auto it=a.first.begin();it!=a.first.end();it++)
{
if(*it>*j)
return 0;
if(*it<*j)
return 1;
j++;
}
}
return a.second>b.second;
}
int main()
{
vector<pair<vector<int>,int>> v;
map<vector<int>,int> l;
vector<int> b;
int n,m,k,j,i;
scanf("%d%d",&n,&m);
while(n--)
{
for(i=0;i<m;i++)
{
scanf("%d",&j);
b.emplace_back(j);
}
l[b]++;
b.clear();
}
for(auto it=l.begin();it!=l.end();it++)
v.emplace_back(make_pair(it->first,it->second));
sort(v.begin(),v.end(),cmp);
printf("%d\n",v.size());
for(i=0;i<v.size()-1;i++)
{
printf("%d",v[i].second);
for(j=0;j<v[i].first.size();j++)
printf(" %d",v[i].first[j]);
printf("\n");
}
printf("%d",v[i].second);
for(j=0;j<v[i].first.size();j++)
printf(" %d",v[i].first[j]);
}