487-3279
Time Limit: 2000MS |
|
Memory Limit: 65536K |
Total Submissions: 232876 |
|
Accepted: 40603 |
Description
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 input will consist of one case. The first line
of the input 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.
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.
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
思路:很坑爹的一道水题么,题目没说字符串有多长,一开始开的长度是30,一直RE。另外如果没有重复的输出的是No duplicates.,注意有句点。。。
两种解法:map或者二叉搜索树中序遍历一次,维护一个cnt(记录次数)域。

1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<string>
6 #include<map>
7 using namespace std;
8 char str[300];
9 string temp;
10 map<string, int>ss;
11 int a[26] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5,
12 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9
13 };
14 void Switch(){
15 char s[300];
16 memset(s, 0, sizeof(str));
17 temp.clear();
18 int k = 0;
19 int len = strlen(str);
20 for(int i = 0;i < len;i ++){
21 if(str[i] >= ‘0‘ && str[i] <= ‘9‘) s[k++] = str[i];
22 if(str[i] >= ‘A‘ && str[i] <= ‘Z‘) s[k++] = a[str[i]-‘A‘] + ‘0‘;
23 if(k == 3) s[k++] = ‘-‘;
24 }
25 temp = s;
26 }
27 int main(){
28 int n;
29 /* freopen("in.c", "r", stdin); */
30 while(~scanf("%d", &n)){
31 ss.clear();
32 for(int i = 0; i < n;i ++){
33 memset(str, 0, sizeof(str));
34 scanf("%s", str);
35 Switch();
36 ss[temp]++;
37 }
38 int flag = 0;
39 for(map<string, int>::iterator it = ss.begin(); it != ss.end(); ++it){
40 if(it->second > 1){
41 flag = 1;
42 cout << it->first << " " << it->second << endl;
43 }
44 }
45 if(flag == 0)
46 printf("No duplicates.\n");
47 }
48 return 0;
49 }

POJ --- 1002,布布扣,bubuko.com
POJ --- 1002
原文:http://www.cnblogs.com/anhuizhiye/p/3649804.html