团体天梯练习 L2-039 清点代码库
L2-039 清点代码库
上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”
这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 \(int\) 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。
输入格式:
输入在第一行中给出 2 个正整数,依次为 \(N\)( \(≤10^{4}\) )和 \(M\)( \(≤10^{2}\) ),对应功能模块的个数和系列测试输入的个数。
随后 \(N\) 行,每行给出一个功能模块的 \(M\) 个对应输出,数字间以空格分隔。
输出格式:
首先在第一行输出不同功能的个数 \(K\)。随后 \(K\) 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 1 个空格分隔,行首尾不得有多余空格。输出首先按模块个数非递增顺序,如果有并列,则按输出序列的递增序给出。
注:所谓数列 { \(A_{1}\), ... , \(A_{M}\) } 比 { \(B_{1}\) , ... , \(B_{M}\) } 大,是指存在 \(1≤i<M\) ,使得
\(A_{1}\) = \(B_{1}\) ,... ,\(A_{i}\) = \(B_{i}\) 成立,且 \(A_{i+1}\) > \(B_{i+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
解题思路
比较简单的模拟题,统计每种序列的个数,然后用 \(sort\) 自定义排序即可。我这里用的是 \(map\),统计每个 \(vector\) 出现的次数,\(unordered\)_\(map\) 应该是不太行的,不能对 \(vector\) 进行哈希。统计完之后,再放入 \(vector\) 中进行自定义排序,然后输出就行了。
/* 一切都是命运石之门的选择 El Psy Kongroo */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
//typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;
map<vector<int>, int> cnt;
typedef pair<vector<int>, int> pvi;
vector<pvi> res;
int n, m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
while(n -- ){
vector<int> v;
for(int i = 0; i < m; i ++ ){
int x; cin >> x;
v.push_back(x);
}
cnt[v] ++ ;
}
for(auto &p : cnt) res.push_back(p);
sort(res.begin(), res.end(), [](pvi &a, pvi &b){
if(a.y != b.y) return a.y > b.y;
return a.x < b.x;
});
cout << (int)res.size() << endl;
for(auto &p : res){
cout << p.y << ' ';
auto v = p.x;
for(int i = 0; i < m - 1; i ++ ) cout << v[i] << ' ';
cout << v.back() << endl;
}
return 0;
}
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17336416.html,未经允许严禁转载