UVa 755 / POJ 1002 487--3279 (排序)(二)

2014-11-24 00:33:24 · 作者: · 浏览: 12
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。
如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)
你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。
Input
第一行指输入的测试数据组数,然后是一个空行。对于每组测试数据,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。每组测试数据间有一组空行。
Output
对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.
每组输出间要输出一个空行。
思路:把所有电话号码转成int型整数,再排序。计数判断重复的,输出。
UVa:
/*0.209s*/  
  
#include  
#include  
#include  
#include  
using namespace std;  
const int trans[] = {0, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9};  
  
int ar[100010];  
  
int main()  
{  
    int t, n, i, j;  
    char ch;  
    bool fg;  
    scanf("%d", &t);  
    while (t--)  
    {  
        memset(ar, 0, sizeof(ar));  
        scanf("%d\n", &n);  
        for (i = 0; i < n; ++i)  
            while ((ch = getchar()) != 10)  
                if (ch != '-') ar[i] = ar[i] * 10 + (isdigit(ch)   ch & 15 : trans[ch & 31]);  
        sort(ar, ar + n);  
        fg = true;  
        for (i = 0; i < n; i = j)  
        {  
            for (j = i; j < n && ar[j] == ar[i]; ++j)  
                ;  
            if (j - i >
1) printf("%03d-%04d %d\n", ar[i] / 10000, ar[i] % 10000, j - i), fg = false; } if (fg) puts("No duplicates."); if (t) putchar(10); } return 0; }

POJ:
/*266ms,748KB*/  
  
#include  
#include  
#include  
using namespace std;  
const int trans[] = {0, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9};  
  
int ar[100010];  
  
int main()  
{  
    int n, i, j;  
    char ch;  
    bool fg;  
    scanf("%d\n", &n);  
    for (i = 0; i < n; ++i)  
        while ((ch = getchar()) != 10)  
            if (ch != '-') ar[i] = ar[i] * 10 + (isdigit(ch)   ch & 15 : trans[ch & 31]);  
    sort(ar, ar + n);  
    for (i = 0; i < n; i = j)  
    {  
        for (j = i; j < n && ar[j] == ar[i]; ++j)  
            ;  
        if (j - i > 1) printf("%03d-%04d %d\n", ar[i] / 10000, ar[i] % 10000, j - i), fg = false;  
    }  
    if (fg) puts("No duplicates.");  
    return 0;  
}