Description:

数字、英大文字、ハイフンからなる文字列がN(<=10万)個与えられる。
これらの文字列は、ハイフンを無視し、アルファベットを特定の規則で数字に直すと、7桁の電話番号になっている。
2回以上現れる電話番号を、辞書式順で、出現回数と共に表示せよ。
そのような電話番号が存在しないなら、"No duplicates."と表示せよ。

Answer:

制限時間が厳しい問題。
PKUでは、C++/G++のコンパイルに最適化をかけない為、STLが遅く、cinを使うとTLE。
電話番号の長さをL、取りうる電話番号のパターン数をM(=1000万)とすると、
mapや、vectorをソートする方法は、L N log(N) でTLE(しかしL<=7なので、どちらかというとSTLのオーバーヘッドが効いているのだと思う)。
電話番号はint 1つで表現できるので、map / vectorをソートして数えると N log(N)でAC。
電話番号のパターン数だけカウンターを用意して数えると、実行速度は問題ないだろうが、メモリを40M使う為MLE。
サイズ10万、H(n)=n/100、衝突時は昇順リストで格納というハッシュテーブルを作ってやれば、メモリも収まり、実行時間もO(M)となる為AC。

ソースコードは1つ目がmap、2つ目がハッシュテーブルの方法。

Source: