POJ 1002 487-3279(数字hash)

Description
给你一个字符串,将其转化成一个电话号码XXX-XXXX的形式,除Q,Z外每个大写字母都有其对应的数字:
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
找出多组号码中是否有相同的号码
Input
数据组数n(n<=100000),每组一个字符串
Output
如果有重复的号码,以XXX-XXXX输出并输出其出现次数,如果没有重复号码则输出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
Solution
计算每个号码的hash值,排序,比较有无相同的即可
Code

#include<cstdio>
#include<algorithm>
using namespace std;
char s[31];
int Hash()//将字符串转化为hash值 
{
    int sum=0;
    for(int i=0,k=0;k<7;i++)
    {
        if(s[i]>='0'&&s[i]<='9')//若是数字则直接计算 
        {
            sum*=10;
            k++;
            sum+=(s[i]-'0');
        }
        else if(s[i]>='A'&&s[i]<'Z')//若是字母则转化为数字后计算 
        {
            sum*=10;
            k++;
            sum+=((s[i]-'A'-(s[i]>'Q'))/3+2);//跳过Q 
        }
    }
    return sum;
}

int main()
{
    int n;
    scanf("%d",&n);
    int data[100005];
    getchar();
    for(int tmp=0;tmp<n;tmp++)
    {
        gets(s);
        data[tmp]=Hash();
    }
    sort(data,data+n);
    bool p=false;//标志变量,判断是否有重复的号码 
    n--;
    for(int i=0,num=1;i<n;i+=num=1)
    {
        while(data[i]==data[i+1])
        {
            num++;
            i++;
        }
        if(num>1)
        {
            printf("%03d-%04d %d\n",data[i]/10000,data[i]%10000,num);
            p=true;
        }
    }
    if(!p)printf("No duplicates.\n");
    return 0;
}

你可能感兴趣的:(POJ 1002 487-3279(数字hash))