电话号码

题目 电话号码

image-42d216c6

思路分析

数据范围很小 纯模拟 重点是选取数据结构

首先哈希每个名字 名字后有他名下所有的电话号码 存在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;

}

同类题型

视频讲解


⬅️ 校庆 🏠 00-刷题理模型 ➡️ 相等的和