Description
lc是一名虫子老师,刚刚教完一届,准备带新的一年级小虫子。你手上有一份他们自己登记的学号名单,学号的标准格式为:xxx-xxxx(x为数字),例如000-0000。但是小虫子们很健忘,老是不记得自己登记学号了没有,所以他们经常重复登记自己的学号,而且每次登记的学号格式都有可能不一样。虫子校长为了刁难老师,允许他们在数字之间的任意位置添加“-”,例如,3-10-10-10的标准格式是310-1010。校长还有一个更恶毒的手段:他给每只小虫子发一个密码本,小虫子们可以按密码本改自己的学号,密码本如下:
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。如果两个学号的标准格式是相同的,那么他们是同一只小虫子登记的。由于lc太愚蠢了,他想找你帮他找出重复的学号和重复的次数。Input
第一行一个整数n(0≤n≤100000)表示名单上学号的总个数,接下来你行每行一个学号(不包含Q和Z),每个学号中刚好有7个数字或字母。
Output
对于每个出现重复的学号产生一行输出,输出是学号的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的学号,则按照学号的字典序升序输出。
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
典型的桶排序。
AC Code:
#include <iostream> #include <string> #define SIZE 10000000 using namespace std; int a[SIZE]; int c[127]; string s; void start(void) { #if 0 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 #endif int i; c['Q'] = c['Z'] = c['-'] = -1; c['0'] = 0; c['1'] = 1; c['A'] = c['B'] = c['C'] = c['2'] = 2; c['D'] = c['E'] = c['F'] = c['3'] = 3; c['G'] = c['H'] = c['I'] = c['4'] = 4; c['J'] = c['K'] = c['L'] = c['5'] = 5; c['M'] = c['N'] = c['O'] = c['6'] = 6; c['P'] = c['R'] = c['S'] = c['7'] = 7; c['T'] = c['U'] = c['V'] = c['8'] = 8; c['W'] = c['X'] = c['Y'] = c['9'] = 9; return; } int main(int argc, char** argv) { int n, i, temp; cin >> n; start(); while (n--) { temp = 0; cin >> s; for (i = 0; i < s.size(); i++) { if (c[s[i]] == -1) { continue; } temp *= 10; temp += c[s[i]]; } a[temp]++; } for (i = 0; i < SIZE; i++) { if (a[i] > 1) { printf("%d-%d %d\n", i / 10000, i % 10000, a[i]); } } return 0; }