【gdgzoi.com解题】虫子的学号

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


猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/80243872