这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。
输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤104)和 M(≤102),对应功能模块的个数和系列测试输入的个数。
随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。
输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。
注:所谓数列 { A 1 , . . . , A M A_1, ..., A_M A1,...,AM} 比 { B 1 , . . . , B M B_1, ..., B_M B1,...,BM} 大,是指存在 1≤i<M,使得 A 1 = B 1 , . . . , A i = B i 成 立 , 且 A i + 1 > B i + 1 A_1=B_1,...,A_i=B_i成立,且 A_i+1>B_i+1 A1=B1,...,Ai=Bi成立,且Ai+1>Bi+1
输入样例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
输出样例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35
/*
A: 10min
B: 20min
C: 30min
D: 40min
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <sstream>
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mem(f, x) memset(f,x,sizeof(f))
#define fo(i,a,n) for(int i=(a);i<=(n);++i)
#define fo_(i,a,n) for(int i=(a);i<(n);++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
#define endl '\n'
using namespace std;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
template<typename T>
ostream& operator<<(ostream& os,const vector<T>&v){for(int i=0,j=0;i<v.size();i++,j++)if(j>=5){j=0;puts("");}else os<<v[i]<<" ";return os;}
template<typename T>
ostream& operator<<(ostream& os,const set<T>&v){for(auto c:v)os<<c<<" ";return os;}
template<typename T1,typename T2>
ostream& operator<<(ostream& os,const map<T1,T2>&v){for(auto c:v)os<<c.first<<" "<<c.second<<endl;return os;}
template<typename T>inline void rd(T &a) {
char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
typedef pair<int,int>PII;
typedef pair<long,long>PLL;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e4+10,M=1e9+7;
int n,m;
map<vector<int>,int>mp;
//疑问:如果题目要求递减顺序输出呢?vector怎么排?
bool cmp(const pair<vector<int>,int>& a,const pair<vector<int>,int>& b){
if(a.second==b.second){ // 可以直接对vector 排序,vecotor按照递增顺序输出。
return a.first<b.first;
}
return a.second>b.second;
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++){
vector<int>t;
for(int j=1;j<=m;j++){
int x;cin>>x;
t.pb(x);
}
mp[t]++;
}
vector<pair<vector<int>,int>>ans(mp.begin(),mp.end());
sort(ans.begin(),ans.end(),cmp);
cout<<ans.size()<<endl;
for(auto c:ans){
cout<<c.second<<" ";
bool flag=0;
for(auto d:c.first){
if(!flag){
cout<<d;
flag=1;
}
else{
cout<<" "<<d;
}
}
cout<<endl;
}
}
int main(){
solve();
return 0;
}