第六届天梯赛真题—L2-3清点代码库(vector,map)

L2-039 清点代码库 (25 分)
在这里插入图片描述

上图转自新浪微博:“阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍。请设计一个程序,能够将代码库中所有功能重复的代码找出。各位大佬有啥想法,我当时就懵了,然后就挂了。。。”

这里我们把问题简化一下:首先假设两个功能模块如果接受同样的输入,总是给出同样的输出,则它们就是功能重复的;其次我们把每个模块的输出都简化为一个整数(在 int 范围内)。于是我们可以设计一系列输入,检查所有功能模块的对应输出,从而查出功能重复的代码。你的任务就是设计并实现这个简化问题的解决方案。

输入格式:
输入在第一行中给出 2 个正整数,依次为 N(≤10^​4
​​ )和 M(≤10^​2),对应功能模块的个数和系列测试输入的个数。

随后 N 行,每行给出一个功能模块的 M 个对应输出,数字间以空格分隔。

输出格式:
首先在第一行输出不同功能的个数 K。随后 K 行,每行给出具有这个功能的模块的个数,以及这个功能的对应输出。数字间以 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

比赛的时候看到这个题,我的第一反应就是可以用string来存功能的输出,再用map来记录。可是map不能排序啊,所以我想了一会儿,想到个小技巧。用vector的构造函数来拷贝map来排序。见代码

#include "bits/stdc++.h"
using namespace std;
map<string ,int> m;
int n,m1,num[10010];
bool cmp(pair<string,int> a,pair<string,int> b)//定义排序规则
{
	if(a.second!=b.second) return a.second>b.second;
	else return a.first<b.first;
}
int main()
{
	cin>>n>>m1;
    getchar();
	while(n--)
	{
		string a;//我直接用字符串来读入
		getline(cin,a); 
		if(m.find(a)==m.end()) m[a]=1;//找不到就直接插入
		else m[a]++;//否则++
	}
	cout<<m.size()<<endl;
	vector<pair<string,int> > v(m.begin(),m.end());//使用vector来将map转化过来,既然map不能排序,我就换成vector呗!
	sort(v.begin(),v.end(),cmp);
	for(auto i:v)	cout<<i.second<<' '<<i.first<<endl; //auto是C11引入的自动变量,自动识别参数类型
}

正当我性勃勃的想要拿满分的时候,运行结果出来了…
在这里插入图片描述
我人傻了,想不出它哪里还能卡我的点。最后,我还是决定不要偷懒,既然它给了我m,那我还是用它吧。
改动也很简单,把string改成vector就行了
见代码

#include "iostream"
#include "map"
#include "vector"
#include "algorithm"
using namespace std;
map<vector<int> ,int> m;//将string换成vector
int n,m1,num[10010];
bool cmp(pair<vector<int>,int> a,pair<vector<int>,int> b)
{
	if(a.second!=b.second) return a.second>b.second;
	else return a.first<b.first;
}
int main()
{
	cin>>n>>m1;
    getchar();
	while(n--)
	{
		vector<int> a;
		for(int i=0;i<m1;i++) 
		{
			int b;
			cin>>b;
			a.push_back(b);
		} 
		 m[a]++;
	}
	cout<<m.size()<<endl;
	vector<pair<vector<int>,int> > v(m.begin(),m.end());//都是一样的......
	sort(v.begin(),v.end(),cmp);
	for(auto i:v)	
	{
	cout<<i.second;
	for(int j=0;j<m1;j++)
	cout<<' '<<i.first[j];
	cout<<endl;
	}
}

我忐忑的点了提交,结果在这里插入图片描述
虽然我写出来了,但是我还是不明白它卡我卡在哪,难道string和vector有什么特别的地方让编译器能分辨出来吗?
如有大佬知道,可以在评论区指点一下小弟
总而言之,题目是解出来了,cherr!
我是阡陌,一个在打ACM的业余选手。如果你喜欢这篇博客,就点个赞再走吧!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

indolence-阡陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值