您的位置:首页 > 其它

POJ 1002 487-3279(数字hash)

2015-08-23 13:38 489 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: