这个怎么写啊 没有思路、、、

懵啊 2018-08-25 11:56:56
【问题描述】
Vasya有几本电话簿,记录了他的朋友们的电话号码,每一个朋友都可以有一或几个电话号码。
Vasya决定整理关于朋友电话号码的信息。给定n个字符串,来自于Vasya的电话簿中的条目。每一条都以朋友的姓名开头,然后跟着当前条目中的电话号码个数,然后是本人的电话号码。有可能几个相同的电话被记录在同一个记录中。
Vasya还认为,如果电话号码a是电话号码b的后缀(也就是说,号码b以a结尾),这两个号码被当作同一个电话号码,那么A被认为是无城市代码,它不应该被考虑。
输出整理后Vasya朋友的电话号码信息。有可能两个不同的人有相同的号码。如果一个人有两个电话号码x和y,x是y的后缀(即y以x结尾),则不输出x。
如果Vasya的电话簿中的某些朋友记录了几次,那么只需要记录一次。
【输入形式】
输入第一行一个整数n(1<=n<=20),Vasya的电话簿上的条目数。
以下n行后面是描述中的格式记录。 朋友的姓名中不包含空字符,长度不超过10位,由小写英文字母组成。电话号码个数在1~10之间。每个电话号码的长度范围在1~10之间,可以包含前导0。
【输出形式】
输出Vasya的朋友的电话号码的有序信息。首先输出电话簿中的朋友数目m。
接下来的m行,包含以格式“姓名 电话号码个数 电话号码1 ... 电话号码k"的条目,号码间以空格分隔。每个记录包含当前朋友的所有电话号码。
每个条目输出按照姓名字母序进行排序,电话号码按照从小到大的顺序排列(注意电话号码:"1"<"01"、"12"<"012",依此类推)
【样例输入】
4
ivan 3 123 123 456
ivan 2 456 456
ivan 8 789 3 23 6 56 9 89 2
dasha 2 23 789
【样例输出】
2
dasha 2 23 789
ivan 4 2 123 456 789

...全文
642 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁劲犇 2020-07-14
  • 打赏
  • 举报
回复
难点在去重与右对齐比较,如果不用STL库,可能存在多次复杂的排序与内存管理。

使用“|”分割字符串并直接检索做右对齐比较,是很讨巧的方法。因为数字中不会出现“|”,所以查找以“|”结尾的字符串就是右对齐查找。
DadongDer 2018-09-06
  • 打赏
  • 举报
回复
有没有不用MAP VECTOR的写法啊
636f6c696e 2018-08-29
  • 打赏
  • 举报
回复
难点在哪里???
懵啊 2018-08-28
  • 打赏
  • 举报
回复
学校oj上的题目,不知道老师哪里找的
zhouqunhai 2018-08-28
  • 打赏
  • 举报
回复
leetcode上的?
懵啊 2018-08-28
  • 打赏
  • 举报
回复
map还没用过 我去查一下 先谢谢啦!!
丁劲犇 2018-08-25
  • 打赏
  • 举报
回复
GNU C++ 编译。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>
using namespace std;
int main(int , char *[])
{
map<string, set<string> > buffer;
//首次读取
int nItems = 0;
cin>>nItems;
for (int i = 0; i < nItems; ++i)
{
int nNumbers = 0;
string name ;
cin >> name >> nNumbers;
for (int j = 0; j < nNumbers; ++j)
{
string num;
cin >> num;
buffer[name].insert(num);
}
}
//去除不含城市的短号
cout << buffer.size() << endl;
for (auto p = buffer.begin();p != buffer.end(); ++p)
{
const string & name = p->first;
const set<string> & nums = p->second;
//按照字符串长度由大到小排序
vector<string> tmp;
vector<string> final;
copy(nums.begin(),nums.end(),back_inserter(tmp));
sort(tmp.begin(),tmp.end(),[](const string &a,const string &b)->bool{
return a.size() > b.size(); });
//开始组合
const size_t sz_items = tmp.size();
string mask ;
for(size_t j = 0; j < sz_items; ++j)
{
const string & cur_test = tmp[j] + "|";
if (mask.find(cur_test)==mask.npos)
{
final.push_back(tmp[j]);
mask.append(cur_test);
}
}
//按照顺序排序
sort(final.begin(),final.end(),
[](const string &a,const string &b)->bool{
if (a.size() < b.size())
return true;
if (a.size() > b.size())
return false;
return a<b;
});
//输出
const size_t sz_final = final.size();
cout << name << " " << sz_final;
for(size_t j = 0; j < sz_final; ++j)
cout << " " << final[j];
cout<<endl;
}


return 0;
}



输出:

4
ivan 3 123 123 456
ivan 2 456 456
ivan 8 789 3 23 6 56 9 89 2
dasha 2 23 789
2
dasha 2 23 789
ivan 4 2 123 456 789
按 <RETURN> 来关闭窗口...


33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧