单点时限: 2.0 sec
内存限制: 256 MB
你有一个通讯录,你想通过号码来搜索联系人,但是你可能只记得某个人号码的一个片段,现在给你一个通讯录列表和一个号码片段,你需要输出所有号码里面有这个号码片段的联系人的姓名。
输入格式
第 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 989843
/*
string+sort
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct g
{
string x,y;
}G[10001];
bool cmp(g a,g b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int main()
{
int t;
cin>>t;
for(int i =0;i < t; i++)
{
int n;
cin>>n;
string x[n],y[n];
for(int j =0 ; j < n; j++)
cin>>x[j]>>y[j];
string c;
cin>>c;
int index=0;
for(int j =0 ; j < n; j++)
{
if(y[j].find(c)!=string::npos)
{
G[index].x=x[j];
G[index].y=y[j];
index++;
}
}
sort(G,G+index,cmp);
printf("case #%d:\n%d\n",i,index);
for(int j = 0; j < index; j++)
cout<<G[j].x<<" "<<G[j].y<<endl;
}
return 0;
}