uva 755

题目

Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel tonight you can order a pizza from Gino‘s by dialing 310-GINO. Another way to make a telephone number memorable is to group the digits in a memorable way. You could order your pizza from Pizza Hut by calling their ``three tens‘‘ number 3-10-10-10.

The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the mapping of letters to numbers, as follows:

A, B, and C map to 2

D, E, and F map to 3

G, H, and I map to 4

J, K, and L map to 5

M, N, and O map to 6

P, R, and S map to 7

T, U, and V map to 8

W, X, and Y map to 9

There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary. The standard form of TUT-GLOP is 888-4567, the standard form of 310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.

Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)

Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more) businesses in the directory have the same telephone number.

Input

The first line of the input contains the number of datasets in the input. A blank line follows. The first line of each dataset specifies the number of telephone numbers in the directory (up to 100,000) as a positive integer alone on the line. The remaining lines list the telephone numbers in the directory, with each number alone on a line. Each telephone number consists of a string composed of decimal digits, uppercase letters (excluding Q and Z) and hyphens. Exactly seven of the characters in the string will be digits or letters. There‘s a blank line between datasets.

Output

Generate a line of output for each telephone number that appears more than once in any form. The line should give the telephone number in standard form, followed by a space, followed by the number of times the telephone number appears in the directory. Arrange the output lines by telephone number in ascending lexicographical order. If there are no duplicates in the input print the line:

No duplicates.

Print a blank line between datasets.

Sample Input

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

Sample Output

310-1010 2
487-3279 4
888-4567 3

思路及说明

基础题,直接查表解决,parseNum中应该还能压缩时间。

代码

#include <iostream>
#include <cstring>
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <map>
using namespace std;

#ifdef DEBUG
ifstream in;
ofstream out;
#endif

#ifdef DEBUG
#define inpath      "./in.txt"
#define outpath     "./out.txt"
#define CIN     in
#define COUT    out
#else
#define CIN     cin
#define COUT    cout
#endif

/*
A,B,andC mapto   2
D,E,and F mapto   3
G,H,and I mapto   4
J,K,and L mapto   5
M,N,and O mapto  6
P,R,and S mapto   7
T,U,and V mapto   8
W,X,and Y mapto   9
*/

struct keyTable{
    keyTable(){
            memset(table, 0, sizeof(char) * 256);
            table[‘A‘] = ‘2‘;
             table[‘B‘] = ‘2‘;
              table[‘C‘] = ‘2‘;
               table[‘D‘] = ‘3‘;
                table[‘E‘] = ‘3‘;
                 table[‘F‘] = ‘3‘;
                  table[‘G‘] = ‘4‘;
                   table[‘H‘] = ‘4‘;
                    table[‘I‘] = ‘4‘;
                     table[‘J‘] = ‘5‘;
                      table[‘K‘] = ‘5‘;
                       table[‘L‘] = ‘5‘;
                       table[‘M‘] = ‘6‘;
                       table[‘N‘] = ‘6‘;
                       table[‘O‘] = ‘6‘;
                       table[‘P‘] = ‘7‘;
                       table[‘R‘] = ‘7‘;
                       table[‘S‘] = ‘7‘;
                       table[‘T‘] = ‘8‘;
                       table[‘U‘] = ‘8‘;
                       table[‘V‘] = ‘8‘;
                       table[‘W‘] = ‘9‘;
                       table[‘X‘] = ‘9‘;
                       table[‘Y‘] = ‘9‘;
    }
    char convert(const char k){
            char ret = table[k];
            if( 0 == ret )
                    return k;
            else
                    return ret;
    }
    int table[256];
};

string parseNum(string vnum,struct keyTable &kt){
                string  num;
                int idx = 1;
                for(string::iterator iter= vnum.begin(); iter != vnum.end(); iter++){
                        if( *iter == (char)‘-‘)
                               ;
                        else{
                                num += kt.convert(*iter);
                                if(3 == idx)
                                    num += ‘-‘;
                                  idx++;
                        }

                }
#ifdef DEBUG
            cout << vnum<< " -> " << num << endl;
#endif // DEBUG
            return num;
}

int main()
{
#ifdef DEBUG
    in.open(inpath,     ios::in);
    out.open(outpath,   ios::out);
    if(in.fail()){
            cout << "input init fail " << "\n";
            return -1;
    }
    if(out.fail()){
             cout << "output init fail " << "\n";
            return -1;
    }
#endif
    struct keyTable kt;
    int cases;
    int numTot;
    string str;
    map<string, int> ansTable;
     CIN >> cases;
     while(cases--){
        ansTable.clear();
        CIN >> numTot;
        for(int numCurr = 1; numCurr <= numTot; numCurr++){
                CIN >> str;
                ansTable[parseNum(str, kt)]++;
        }
        int  flag = 0;
        for(map<string, int>::iterator iter = ansTable.begin(); iter != ansTable.end(); iter++){
                    if(iter->second > 1){
                        COUT << iter->first << " " << iter->second << endl;
                        flag = 1;
                    }
        }
        if(0 == flag){
                COUT<<"No duplicates."<<endl;
        }
        if(0 != cases)
                COUT << endl;
     }
return 0;
}

uva 755

时间: 2024-10-29 19:10:13

uva 755的相关文章

487--3279 UVA 755 其实有三种解法

说说:这道题初看挺简单的,题意无非就是将一串字符转化成一个用'-'隔开的电话号码,然后把出现超过一次的号码按照字典升序输出即可.但是这样样做是会超时的....其实把电话号码中间的'-'去掉,电话号码其实就是一个整数,有了这个想法那就简单啦.只要设立一个超大的数组包含所有可能的电话号码,然后数组的值是该号码出现的次数,统计完后遍历一遍输出即可.但是第三种相当于把前两种方法法结合起来了.把号码当成一个整数,但是号码存储在一个数组中,号码出现的次数存储在另一个数组中.这样在插入新号码的时候就排序,然后

Uva 755 487-3125

分析: 这道题是刘汝佳灰书上所给的一道题.题目很简单,就是处理字符串并排序输出.但我却卡了很久,试了很多不同的方式,至今使用字符串的一个还没有调试出来.POJ 1002是一道几乎相同的题(不过没有多组数据). 注意事项: 1. 数据量很大,最好不用cin/cout(当然也可以取消std::同步). 2. 每个电话号码的初始输入可能很长. 3. 号码长度不够时要补0. //用整数处理字符串(UVa已过)#include<iostream> #include<cstdio> #incl

uva 755 (487--3279)排序

这是一简单的排序,之所以把这道题放上面呢,是因为我在这道题上实在wa太多了,wa了7次,中间找出来 个错误,就是在倒数第一个和倒数第二个相等的情况下我没有输出他们的个数,改正后还是wa,最后我发现原来是每组 数据之间输出一个空行.....坑了我好久,一直以为是每组后面都有空行... 放代码: #include<stdio.h> #include<stdlib.h> #include<string.h> //char a[100005]; char a[100005][1

uva 755 - 487--3279

1 #include <iostream> 2 #include <string> 3 #include <map> 4 #include <algorithm> 5 #include <cstdio> 6 #include <cctype> 7 using namespace std; 8 9 const char kTable[] = "2223334445556667Q77888999Z"; 10 int m

Volume 1. Elementary Problem Solving :: Sorting/SearchingUva 340,10420,10474,152,299,120,156,400,755

刘汝佳 算法入门 第一版 Uva题目集合(四) Uva 340 #include<stdio.h> #include<string.h> int h[1001][2],g[1001]={0}; int n,m=0,i,j,k,a,b,o; int main() { #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); freopen("output.txt","

小白书练习题5.5.3 排序检索类、

UVA 340 Master-Mind Hints 题意:猜数字游戏,给n个数的序列给你.接下来一行是答案序列.剩下的都是猜测序列.对于每一个猜测序列,统计有多少个数字相同并且位置相同.有多少数字相同位置不同.每一个数字只能用一次. 思路:直接统计可以求出数字相同并且位置相同的哪一些数.在此过程中我加了一个标记数组.标记那些用过的数的位置为1,没用过为0:然后枚举猜测中哪些没用过的数字.去答案序列中找.当数字相等并且答案行中那个数也没用过时.计数加1: 1 #include<cstdio> 2

uva 10397 - Connect the Campus

Problem E Connect the Campus Input: standard input Output: standard output Time Limit: 2 seconds Many new buildings are under construction on the campus of the University of Waterloo. The university has hired bricklayers, electricians, plumbers, and

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te