题目描述
首先一句,y总666;
这题可以根据map没有重复关键字的特点来做题,在学了y总的算法基础(真的超值)后,总算明白了这道题的解法。
这题有一个坑点需要用scanf 不然直接用cin会超时
当然使用一句:ios::sync_with_stdio(false);可以解决问题
第一次做题解,可能说的不好请多原谅
参考文献
y总视频
C++ 代码
include< bits / stdc++.h > //万能头文件
using namespace std;
map< vector < int >, int > cnt; //创建一个map容器,可以想象这是一个可以存数组,并且可以数组出现次数的盒子
vector< pair < int , vector< int > > > ans; //存最后的答案
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
vector< int > res; //创建一个vector 用来每行的数据
for(int j=0;j<m;j++)
{
int k;
scanf("%d",&k);
res.push_back(k); //将k的值放入res中
}
cnt[res]++; //如果cnt检测到有与res中都相同的数据就会加一。
}
for(auto [ k , v ]:cnt) ans.push_back({-v,k}); //从cnt的前往后遍历,而cnt中的<vector<int>,int>分别用k,v表示。因为要出现次数要从大到小排列,因此先将v取负数。
sort(ans.begin(),ans.end()); //排序
printf("%d\n",cnt.size()); //输出cnt的大小,也就是存了多少组数据
for(auto x:ans) 将ans从前往后遍历一次输出答案
{
printf("%d",-x.first);
for(auto y:x.second) //将ans中的vector< int >中存的数从前往后输出出来
{
printf(" %d",y);
}
printf("\n"); //记得换行
}
}