假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。
输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤104)和 M(≤102),对应功能模块的个数和系列测试输入的个数。
随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。
输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。
注:所谓数列 { A1, …, AM } 比 { B1, …, BM } 大,是指存在 1≤i<M,使得 A1,=B1,…,Ai=Bi 成立,且 Ai+1>Bi+1。
输入样例:
1 2 3 4 5 6 7 8
| 7 3 35 28 74 -1 -1 22 28 74 35 -1 -1 22 11 66 0 35 28 74 35 28 74
|
输出样例:
1 2 3 4 5
| 4 3 35 28 74 2 -1 -1 22 1 11 66 0 1 28 74 35
|
思路:
利用map,统计所有功能模块相同对应输出的个数。
然后利用结构体进行排序。
C++程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <map> #include <set> #include <regex> #include <stack> #include <queue> #include <math.h> #include <vector> #include <cstdio> #include <string> #include <cstring> #include <sstream> #include <iomanip> #include <numeric> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int dir[4][2] = { {1,0} ,{-1,0},{0,1},{0,-1} }; typedef struct node { int cnt; vector<int> outputs; bool operator < (const node& a) const { if (cnt != a.cnt) { return cnt > a.cnt; } else { return outputs < a.outputs; } } }node, * pnode; int main(){ int n, m;
cin >> n >> m; map<vector<int>, int> _map; while (n--) { vector<int> t(m); for (int i = 0; i < m; i++) { cin >> t[i]; } _map[t]++; }
vector<node> ans; for (map<vector<int>,int>::iterator it = _map.begin(); it != _map.end(); it++) { node t; t.cnt = it->second; t.outputs = it->first; ans.push_back(t); }
sort(ans.begin(), ans.end());
cout << _map.size() << endl; for (node& t : ans) { cout << t.cnt; for (int& output : t.outputs) { cout << " " << output; } cout << endl; }
return 0; }
|