POJ.1002 487-3279

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 85744 Accepted: 14222

Description

企业很喜欢不容易忘记的电话号码。造出这种电话号码的方式之一,是把号码换成字母,然后拼出不容易忘记的词汇。比如说,拨TUT-GLOP就能接通滑铁卢大学。其他让人不容易电话号码的方式,还包括数字拆成容易记忆的片段,比如说310-1010这个号码如果写成3-10-10-10的话,或许会变得比较容易记得也说不定。
这些改写过的电话号码写回标准格式的话,还是七位数字,前面三位、后面四位,中间用连字号隔开。TUT-GLOP是888-4567,3-10-10-10则是310-1010。字母换成数字的规则是:
A, B, and C map to 2
D, E, and F map to 3
G, H, and I map to 4
J, K, and L map to 5
M, N, and O map to 6
P, R, and S map to 7
T, U, and V map to 8
W, X, and Y map to 9
Q与Z没有用到。另外,连字号可以全部略过。把所有电话号码都改成标准写法的时候,要一并检查有没有出现重复的号码。但是程式可以用的记忆体上限是30000KB。

输入与输出

第一行是测试资料笔数n(最大100000),接着n行是以整数、大写字母、连字号构成的字串。请根据题目说明,把电话号码整理成标准格式,然后依照数字顺序依序输出重复出现两次以上的电话号码,在号码后面显示重复出现的次数。如果所有号码都没有重复的话,就显示“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

Short Coding写出简捷好程式-短码达人的心得技法的p.201的程式码:

*p,v[750000],k=v;
d,t,c;

main(n)
{
for(gets(&n);n=getchar()%48,~n;)
{
n-‘-‘?
n-‘\n’?
t=t*10+(n>9?n/3.2-3:n)
:(++*(p=k+t*3),t=0)
:0;
}

for(d=n=0;n<1e7;++n)
{
c=*(p=k+n*3)<<8>>8;
d+=c>1&&printf(“%03d-%04d %d\n”,n/10000,n%10000,c);
}

d||puts(“No duplicares.”);
}

编译时会有很多警告:

看来这个欺骗技俩在MinGW内含的GNU C/C++ 3.4.5之下行不通!

不好意思,今天又重新检查一下程式,发现v[750000]这个阵列少打一个0了,原来是阵列长度不够造成的错误,看来还是要加强细心的程度!