11279: 【原1279】打电话
题目
题目描述
author: Chen Xutong 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1279
Description
哆啦A梦把我们的cxt同学扔到远古时代了,然后我们可爱的哆啦A梦同学就回到22世纪找可爱的哆啦美同学搅基去了,心急如焚的cxt发现身边有一个手机,他断定肯定是哆啦A梦的,但是他发现这个手机的电话簿好乱,甚至还有。。。字母!@[email protected] 很快cxt就发现了对应关系,因为电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。而电话拨号盘提供了从字母到数字的映射,映射关系如下:
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。如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)。
cxt表示重复次数最多的电话号码八成就是哆啦美的 = =。然而保险起见cxt此时并不急于找到重复次数最多的电话号码,首先他要先把重复出现的号码都找出来。
Input Format
输入的格式是,第一行是一个正整数 n,指定电话号码薄中号码的数量(1 ≤ N ≤ 100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。
Output Format
对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.
Sample Input
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
Sample Output
310-1010 2
487-3279 4
888-4567 3
FineArtz's solution
/* 打电话 */
#include <iostream>
#include <string>
#include <map>
using namespace std;
const char res[26] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9, 0};
bool IsLet(char ch) { return (ch >= 'A' && ch <= 'Z'); }
bool IsNum(char ch) { return (ch >= '0' && ch <= '9'); }
int main(){
int n, flag = 0;
cin >> n;
map<string, int> ans;
for (int i = 1; i <= n; ++i){
string s, ss = "";
cin >> s;
for (string::iterator it = s.begin(); it != s.end(); ++it){
if (IsNum(*it)) ss.push_back(*it);
else if (IsLet(*it)) ss.push_back(res[*it - 'A'] + '0');
}
ss.insert(ss.begin() + 3, '-');
++ans[ss];
}
for (map<string, int>::iterator it = ans.begin(); it != ans.end(); ++it)
if (it->second > 1){
cout << it->first << ' ' << it->second << endl;
flag = 1;
}
if (!flag) cout << "No duplicates." << endl;
return 0;
}