电话号码
题目 电话号码
思路分析
数据范围很小 纯模拟 重点是选取数据结构
首先哈希每个名字 名字后有他名下所有的电话号码 存在vector里
所以数据结构确定用 unordered_map>存
然后对于电话号码要处理后缀相同问题
后缀不好做 就翻转一下变成问前缀问题
前缀可以多种写了 这里因为很小 直接用find
首先还是借用一个特性
字符串排序后 如果存在直接前缀关系的两个串一定是临近的 且父串在后
所以只需要排序 用i+1find一下i看存不存在即可
代码实现
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,vector<string>> h;
int n;
int main()
{
cin>>n;
while(n--){
string name;
int cnt;
cin>>name>>cnt;
while(cnt--){
string number;
cin>>number;
reverse(number.begin(),number.end());//后缀不好判断 改为前缀
h[name].push_back(number);
}
}
cout<<h.size()<<endl;
for(auto& [name,numbers]:h){
sort(numbers.begin(),numbers.end());//排序后有公共前缀关系的就会相邻
vector<string> res;
for(int i=0;i<numbers.size();i++){
if(i+1<numbers.size() && numbers[i+1].find(numbers[i])==0)
continue;
res.push_back(numbers[i]);
}
cout<<name<<" "<<res.size();
for(auto& s:res){
reverse(s.begin(),s.end());//前面翻转过 还原一下
cout<<" "<<s;
}
puts("");
}
return 0;
}
💬 评论