【问题描述】
每个人都喜欢有令人难忘的电话号码。要想让电话号码变得令人难忘的一种方法是拼出一个令人难忘的单词或短语。例如,你可以拨打滑铁卢大学的电话,拨打令人难忘的电话号码TUT-GLOP。
有时只有一部分号码被用来拼写一个单词,例如,你可以拨打310-gino从Gino's订购披萨。
要使电话号码令人难忘的另一种方法是以一种令人难忘的方式对数字进行分组。你可以从比萨饼小屋中订购比萨饼,方法是拨打他们的“3个10”,即号码3-10-10-10。
电话号码的标准格式是七位的十进制数字,第三和第四位之间包含连字符(例如888-1200)。电话的键盘提供字母到数字的映射,如下所示:
A, B, C映射到2
D, E, F映射到3
G, H, I映射到4
J, K, L映射到5
M, N, O映射到6
P, R, S映射到7
T, U, V映射到8
W, X, Y映射到9
Q和Z没有映射。连接符不拨号,必要时可加上或去除。TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
当两个电话号码有相同的标准格式时是等价的(拨同样的号码)。
你的公司正在编制本地企业的电话号码目录,作为质量控制的一部分,你需要检查没有两个(或多个)企业具有相同的电话号码。
【输入形式】
输入包括一个案例。输入的第一行为一个正整数,指定目录中电话号码的数目(最多100,000)。其余的各行列出目录中的电话号码,每个号码单独占一行。每个电话号码都是一个由十进制数字、大写字母(不包括Q和z)和连字符组成的字符串。字符串中的七个字符或是数字或是字母。
【输出形式】
对于出现超过一次的每个号码,按照标准格式每个输出一行,然后是空格,接着输出出现的次数。只出现1次的电话号码不输出。
【样例输入】
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
【样例输出】
310-1010 2
487-3279 4
888-4567 3
题解
思路
- 1.我们肯定是用map来存储结果,因为有出现的次数问题
- 2.我们要统一度量衡,转换为统一的数字模式
- 3.map遍历满足要求输出即可
代码
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
map<string,int> res;
int n;
cin>>n;
while(n--){
string s,temp="";
cin>>s;
/******************字符串转换为统一标准************************/
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9')
temp+=s[i];
else if(s[i]=='A'||s[i]=='B'||s[i]=='C')
temp+='2';
else if(s[i]=='D'||s[i]=='E'||s[i]=='F')
temp+='3';
else if(s[i]=='G'||s[i]=='H'||s[i]=='I')
temp+='4';
else if(s[i]=='J'||s[i]=='K'||s[i]=='L')
temp+='5';
else if(s[i]=='M'||s[i]=='N'||s[i]=='O')
temp+='6';
else if(s[i]=='P'||s[i]=='R'||s[i]=='S')
temp+='7';
else if(s[i]=='T'||s[i]=='U'||s[i]=='V')
temp+='8';
else if(s[i]=='W'||s[i]=='X'||s[i]=='Y')
temp+='9';
}
temp.insert(3,"-");//-输出处理
res[temp]++;
}
for(map<string,int>::iterator it=res.begin();it!=res.end();it++){
if(it->second>1){
cout<<it->first<<" "<<it->second<<endl;
}
}
return 0;
}