Skip to content

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;
}