1.题目引入:

一个电话销售员正在整理他的电话簿。

电话簿中记录了他的全部客户的电话号码。

一个客户可能有不止一个电话号码。

不同客户可能拥有完全相同的电话号码。

电话簿中一共包含 nn 条记录。

每条记录都是首先包含一个字符串,表示客户的姓名,然后包含一个整数,表示本条记录包含的电话号码数量,最后是本条记录所包含的电话号码。

不同客户的姓名两两不同,所以如果两条记录包含的客户姓名相同,那么我们认为这都是记录的同一人的电话信息。

同一记录中可能包含相同的电话号码,不同记录中也可能包含相同的电话号码。

在进行整理时,应遵守如下原则:

  1. 如果一个客户拥有多条记录,则需要将这些记录进行合并,每人只保留一条记录,去记录他的全部有效号码
  2. 如果一个客户记录的多个电话号码完全相同,则只保留一个作为有效号码,其余的全部视为无效号码
  3. 如果一个客户记录的两个不同电话号码 aa 和 bb 满足 aa 是 bb 的后缀,则号码 aa 视为无效号码

请输出整理后的电话记录。

输入格式

第一行包含整数 nn,表示记录数量。

接下来 nn 行,每行描述一条记录,首先包含一个长度不超过 1010 的由小写字母构成的非空字符串,表示客户姓名,然后包含一个不超过 1010 的正整数,表示本条记录包含的号码数量,最后包含本条记录的所有号码,每个号码都是长度不超过 1010 的由数字构成的非空字符串,可能包含前导 00。

输出格式

首先输出一个整数 mm,表示完成整理后的记录数量。

接下来 mm 行,每行输出一条记录信息,格式要求与输入一致。

同一行的数据之间用单个空格隔开。

记录的先后顺序随意,一条记录中的号码顺序随意。

数据范围

前三个测试点满足 1≤n≤41≤n≤4。
所有测试点满足 1≤n≤201≤n≤20。

2.样例输出: 

输入样例1:

2
i 1 00123
m 1 00123

输出样例1:

2
m 1 00123
i 1 00123

输入样例2:

3
l 2 612 12
p 1 12
k 1 612

输出样例2:

3
k 1 612
p 1 12
l 1 612

输入样例3:

4
i 3 123 123 456
i 2 456 456
i 8 789 3 23 6 56 9 89 2
d 2 23 789

输出样例3:

2
d 2 23 789
i 4 789 123 2 456

这道题主要是模拟,我们需要解决以下问题: 1.如何去重 ,2. 如何确定前后缀,

3.如何进行标记计数

这里我用的是 STL ,具体如下:

3.代码如下: 

#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;map<string,vector<string>>  a;
bool check(string &a,string &b)   // 判断若 b 为 a 的字串返回 true
{return b.size()<a.size()&&a.substr(a.size()-b.size())==b;
}
int main()
{int n;cin>>n;for(int i=0;i<n;i++){string name,str;int cnt;cin>>name>>cnt;while(cnt--){cin>>str;a[name].push_back(str);   //将每一个人的所有电话号码都进行记录 }}cout<<a.size();  // 输出人的总数 for(auto &[s,v]:a)   // 遍历每一个人,并将每个人电话号码进行整理 {cout<<"\n";sort(v.begin(),v.end());  // 排序 v.erase(unique(v.begin(),v.end()),v.end());  // 去重 int cnt=0;vector<bool> book(v.size(),false);   // 初始化 for(int i=0;i<v.size();i++)   // 上面已经进行了排序且相同前缀的长度小的排在前面 {cnt++;for(int j=0;j<v.size();j++){if(j!=i){if(check(v[j],v[i]))   // 去除后缀 {book[i]=true;  // 将小的有前缀的进行标记 cnt--;break;}}}}cout<<s<<" "<<cnt;for(int i=0;i<v.size();i++){if(!book[i]){cout<<" "<<v[i]; } }}return 0;
}

电话号码 (哈希表+模拟)相关推荐

  1. C++ 哈希表模拟实现(补充)

    目录 1.引例:两个练习题 2.定义基本的存储结构 3.Insert() 4.Erase() 5.string为参数的情况 6.添加类模板 7.整体代码 1.引例:两个练习题 2.定义基本的存储结构 ...

  2. 【算法】 哈希表 自己模拟hashMap

    文章目录 1.概述 2.Hash表 3. 模拟 1.概述 视频地址:https://www.bilibili.com/video/BV1E4411H73v?p=86 哈希表(散列)-Google.上机 ...

  3. Map和Set,简单模拟实现哈希表以及哈希表部分底层源码的分析

    目录 Map和Set的简单介绍 降低哈希冲突发生的概率以及当冲突发生时如何解决哈希冲突 简单模拟实现哈希表--1.key为整形:2.key为引用类型 哈希表部分底层源码的分析 1.Map和Set的简单 ...

  4. 电话号码查询系统(数据结构之哈希表)

    哈希表 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 1. ...

  5. C++--哈希表--散列--冲突--哈希闭散列模拟实现--问答--1107

    1.哈希 概念 可以不经过任何比较,直接从表中得到要搜索的元素. 关键在于通过某种散列函数,使元素的存储位置与它的关键码之间能够建立 一一映射的关系.这样就可以通过o(1)的时间复杂度来寻找到元素. ...

  6. 哈希表(模拟散列表 字符串哈希)

    目录 一.哈希表的概念 二.模拟散列表 题目 代码实现 ①拉链法 ②开放寻址法 三.字符串哈希 题目 思路 注意点 代码实现 一.哈希表的概念 哈希表(又称为散列表),将一个比较大的值域映射到一个小的 ...

  7. CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

    题目分析 来源:acwing 分析: 本题采用vector< string > 来读入原来模板.接下来的m行需要用到哈希表,进行模板和具体内容的映射. 遍历vector,如果找到{{,就对 ...

  8. C++ 使用哈希表封装模拟实现unordered_map unordered_set

    一.unordered_map unordered_set 和 map set的区别 1. map set底层采取的红黑树的结构,unordered_xxx 底层数据结构是哈希表.unordered_ ...

  9. JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

最新文章

  1. python tab键自动补全_Python Tab自动补全
  2. python 根据时间来生成唯一的字符串
  3. Redis入门基础详解
  4. AV1生态系统更新:2019年6月
  5. maven junit测试_使用Maven Failsafe和JUnit @Category将集成测试与单元测试分开
  6. border三角形阴影(不规则图形阴影)和多重边框的制作
  7. attention机制_简析Attention机制—优缺点,实现,应用
  8. iOS中self.xxx 和 _xxx 下划线的区别
  9. mysql之分页查询
  10. rexpathbs4
  11. java位数补0处理
  12. C# 格式化json移除空值,参数按照第一个字符的键值 ASCII 码递增排序(SM2签名)
  13. 离线安装Silverlight 工具
  14. 2021北京交通大学《深度学习》平台课—第1讲:绪论
  15. MySQL查询不同年份母亲节_计算某年母亲节是哪一天_晴空呐的博客-CSDN博客
  16. 电脑光驱不见了(错误代码39 黄色感叹号)的解决办法
  17. NLP太卷,我去研究蛋白质了~
  18. 无法支持计算机上的硬件,win7“不支持的硬件,你的电脑使用的处理器专为最新版win...
  19. 计算机网络安全开题报告怎么写,网络安全开题报告范文精选
  20. An attribute defined in json.encoder line 158 hides this methodpylint(method-hidden)

热门文章

  1. Flutter 1.0 正式版: Google 的跨平台 UI 工具包
  2. Android官网教你如何系统学习
  3. 通过实战测试无线网络的速度
  4. 江苏事业单位计算机类考申论吗,想进事业单位?江苏事业单位统考,考些什么你知道吗?...
  5. 事业编招聘:国家无线电监测中心2022年公开招聘
  6. ----down----
  7. 大神手把手教源码阅读的方法、误区以及三种境界
  8. 平庸和优秀的距离,我要得不仅仅是土豆
  9. android悬浮球代码,Android 仿360悬浮球与加速球
  10. 单道批处理 多道批处理