题目描述:
你有一个通讯录,你想通过号码来搜索联系人,但是你可能只记得某个人号码的一个片段,现在给你一个通讯录列表和一个号码片段,你需要输出所有号码里面有这个号码片段的联系人的姓名。
输入格式:
第 1 行为一个整数T(1≤T≤15)为问题数。
每个问题按如下格式进行输入:
第一行是一个整数n,表示通讯录里面有n个联系人(n < 10000),接下来的n行,每行是一个姓名(长度不超过30,只包含小写英文字母)和一个手机号码(长度不超过11),姓名和手机号码中间有一个空格隔开。最后一行是一个号码片段(长度不超过11)。
输出格式:
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等),然后第一行先输出一个整数表示符合条件的联系人个数,接下来每行输出一个联系人(空格隔开姓名和号码),请按姓名的字典序递增顺序输出所有满足条件的姓名和号码, 如果两个联系人姓名相同则按号码的字典序递增输出。
Input |
3 4 police 110 hospital 120 firepolice 119 nineoneone 911 11 14 rhgyptk 47242 brynx 66585778 kinyhpw 166021 uv 33 pr 584184 d 735517 ksodi 471831758 lgexsqtsf 088 bw 4 kn 62 crtsgidj 56760518 hwpfp 0840630 squsf 686 plwnpsix 80045 4 5 dsfd 989843 dfdfdf 34344 dsfd 324344545 erere 454545129 dsfd 2343 43 |
Output |
case #0: 3 firepolice 119 nineoneone 911 police 110 case #1: 6 bw 4 hwpfp 0840630 ksodi 471831758 plwnpsix 80045 pr 584184 rhgyptk 47242 case #2: 4 dfdfdf 34344 dsfd 2343 dsfd 324344545 dsfd 98984 |
思路分析:
定义结构体Dir保存联系人信息
typedef struct Node {
string name;
string phone;
} Dir;
遍历通讯录,查找满足所给字符串的电话号码保存。调用sort()函数对联系人及其联系方式按要求排序(按姓名的字典序递增顺序输出, 如果两个联系人姓名相同则按号码的字典序递增输出),自定义排序方式cmp()。
bool cmp(Node p, Node q) {
if(p.name == q.name)
return p.phone < q.phone;
return p.name < q.name;
}
代码:
#include <bits/stdc++.h>
using namespace std;
typedef struct Node {
string name;
string phone;
} Dir;
bool cmp(Node p, Node q) {
if(p.name == q.name)
return p.phone < q.phone;
return p.name < q.name;
}
int main() {
int i, n, m;
int num = 0;
cin >> n;
while(n--) {
Dir dir1[1000], dir2[100];
int loc, k = 0;
string str;
cin >> m;
for(i = 0; i < m; i++) {
cin >> dir1[i].name >> dir1[i].phone;
}
cin >> str;
for(i = 0; i < m; i++) {
loc = dir1[i].phone.find(str);
if(loc >= 0) {
dir2[k].name = dir1[i].name;
dir2[k++].phone = dir1[i].phone;
}
}
sort(dir2, dir2 + k, cmp);
cout << "case #" << num++ << ":" << endl << k << endl;
for(i = 0; i < k; i++) {
cout << dir2[i].name << " " << dir2[i].phone << endl;
}
}
return 0;
}