#include <iostream>
#include <cstring>
#include <algorithm>
#include<vector>
#include<map>
#define x first
#define y second
using namespace std;
const int N = 100010;
int n,m;
map<vector<int>,int>cnt;// 前面储存数字元素,后面储存出现次数,map从小到大自动排序
vector<pair<int,vector<int>>>ans;//答案,相当于把以上计数的结果,以pair的形式放于vector中,以便排序
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)//从前往后读入每一行
{
vector<int>line;
for(int j=0;j<m;j++)
{
int x;
cin>>x;
line.push_back(x);
}
cnt[line]++;
}
//遍历map里的所有元素,数量从大到小排
for(auto& p:cnt)ans.push_back({-p.y,p.x});//按照出现次数进行降序排列
///另一种写法:for(auto [k, v] : mp) ans.push_back({-v, k});
///遍历mp
///为什么这里要取-v呢,因为在下面的排序中,pair是默认从小到大排序的,所以取一个负号
sort(ans.begin(),ans.end());
cout<<cnt.size()<<endl;
for(auto& p:ans)
{
printf("%d",-p.x);//输出每一行的个数
for(auto x:p.y)
printf(" %d",x);
puts("");
}
return 0;
}
// 考察STL,首先,统计的话很容易就想到了用map来做,键用vector来存(注意这里,map的自动排序会按照vector的字典序,
// 也就是每一行的字典序从小到大来排序),所以根据括号,我们还需要一个vector来重新储存去重之后的这些值,
// 所以就定义一个vector< pair<int,vector<int> > > ans,之后再用一发sort,就会按照出现次数来排序了
04-26
1754