团体天梯练习 L2-039 清点代码库

发布时间 2023-04-20 13:20:26作者: Amαdeus

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;
}