电话号码 (哈希表+模拟)
1.题目引入:
一个电话销售员正在整理他的电话簿。
电话簿中记录了他的全部客户的电话号码。
一个客户可能有不止一个电话号码。
不同客户可能拥有完全相同的电话号码。
电话簿中一共包含 nn 条记录。
每条记录都是首先包含一个字符串,表示客户的姓名,然后包含一个整数,表示本条记录包含的电话号码数量,最后是本条记录所包含的电话号码。
不同客户的姓名两两不同,所以如果两条记录包含的客户姓名相同,那么我们认为这都是记录的同一人的电话信息。
同一记录中可能包含相同的电话号码,不同记录中也可能包含相同的电话号码。
在进行整理时,应遵守如下原则:
- 如果一个客户拥有多条记录,则需要将这些记录进行合并,每人只保留一条记录,去记录他的全部有效号码。
- 如果一个客户记录的多个电话号码完全相同,则只保留一个作为有效号码,其余的全部视为无效号码。
- 如果一个客户记录的两个不同电话号码 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;
}
电话号码 (哈希表+模拟)相关推荐
- C++ 哈希表模拟实现(补充)
目录 1.引例:两个练习题 2.定义基本的存储结构 3.Insert() 4.Erase() 5.string为参数的情况 6.添加类模板 7.整体代码 1.引例:两个练习题 2.定义基本的存储结构 ...
- 【算法】 哈希表 自己模拟hashMap
文章目录 1.概述 2.Hash表 3. 模拟 1.概述 视频地址:https://www.bilibili.com/video/BV1E4411H73v?p=86 哈希表(散列)-Google.上机 ...
- Map和Set,简单模拟实现哈希表以及哈希表部分底层源码的分析
目录 Map和Set的简单介绍 降低哈希冲突发生的概率以及当冲突发生时如何解决哈希冲突 简单模拟实现哈希表--1.key为整形:2.key为引用类型 哈希表部分底层源码的分析 1.Map和Set的简单 ...
- 电话号码查询系统(数据结构之哈希表)
哈希表 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 1. ...
- C++--哈希表--散列--冲突--哈希闭散列模拟实现--问答--1107
1.哈希 概念 可以不经过任何比较,直接从表中得到要搜索的元素. 关键在于通过某种散列函数,使元素的存储位置与它的关键码之间能够建立 一一映射的关系.这样就可以通过o(1)的时间复杂度来寻找到元素. ...
- 哈希表(模拟散列表 字符串哈希)
目录 一.哈希表的概念 二.模拟散列表 题目 代码实现 ①拉链法 ②开放寻址法 三.字符串哈希 题目 思路 注意点 代码实现 一.哈希表的概念 哈希表(又称为散列表),将一个比较大的值域映射到一个小的 ...
- CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入
题目分析 来源:acwing 分析: 本题采用vector< string > 来读入原来模板.接下来的m行需要用到哈希表,进行模板和具体内容的映射. 遍历vector,如果找到{{,就对 ...
- C++ 使用哈希表封装模拟实现unordered_map unordered_set
一.unordered_map unordered_set 和 map set的区别 1. map set底层采取的红黑树的结构,unordered_xxx 底层数据结构是哈希表.unordered_ ...
- JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)
注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...
最新文章
- python tab键自动补全_Python Tab自动补全
- python 根据时间来生成唯一的字符串
- Redis入门基础详解
- AV1生态系统更新:2019年6月
- maven junit测试_使用Maven Failsafe和JUnit @Category将集成测试与单元测试分开
- border三角形阴影(不规则图形阴影)和多重边框的制作
- attention机制_简析Attention机制—优缺点,实现,应用
- iOS中self.xxx 和 _xxx 下划线的区别
- mysql之分页查询
- rexpathbs4
- java位数补0处理
- C# 格式化json移除空值,参数按照第一个字符的键值 ASCII 码递增排序(SM2签名)
- 离线安装Silverlight 工具
- 2021北京交通大学《深度学习》平台课—第1讲:绪论
- MySQL查询不同年份母亲节_计算某年母亲节是哪一天_晴空呐的博客-CSDN博客
- 电脑光驱不见了(错误代码39 黄色感叹号)的解决办法
- NLP太卷,我去研究蛋白质了~
- 无法支持计算机上的硬件,win7“不支持的硬件,你的电脑使用的处理器专为最新版win...
- 计算机网络安全开题报告怎么写,网络安全开题报告范文精选
- An attribute defined in json.encoder line 158 hides this methodpylint(method-hidden)