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 %dn”,n/10000,n%10000,c);
}

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

編譯時會有很多警告:

看來這個欺騙技倆在MinGW內含的GNU C/C++ 3.4.5之下行不通!

不好意思,今天又重新檢查一下程式,發現v[750000]這個陣列少打一個0了,原來是陣列長度不夠造成的錯誤,看來還是要加強細心的程度!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *