TLEは常にPythonを使用してSBANK SPOJで発生します。それを解決するには、dict()
にはKEYS
(最大 - 100000)の莫大な数がありますが、dict()
をソートする必要があります。私のコードでsorted()
関数を使用しても効果はありません。速い解決策はありますか?ご協力いただきありがとうございます。素早くdict()を大量のキーでソートするには?
以下の私のコード:
for j in range(n): # n is the number of keys
account = sys.stdin.readline().rstrip()
dic.setdefault(account, 0)
dic[account] += 1
sorted(dic) # **this sort take a lot of time**
EDIT1:ジャスティンピールのヒントによると、私は以下の私のコードを更新し、それでもTLEを返します。どのようにできるのか?
import sys
import psyco # import psyco module to speed up
psyco.full()
nCase = int(sys.stdin.readline().split()[0])
for i in range(nCase):
n = int(sys.stdin.readline().split()[0])
dic = dict()
lst = list()
for j in range(n):
account = sys.stdin.readline().rstrip()
dic.setdefault(account, 0)
dic[account] += 1
sys.stdin.readline()
lst = dic.keys() # store keys in list
lst.sort()
for account in lst:
sys.stdout.write('%s %s\n' % (account, dic[account]))
'lst = list()'の必要はありません。また、 'setdefault'を使用すると、あなたの速度が遅くなります。 'account'が' dic'にあるかどうかを明示的にチェックする方が速いです。本当なら1を加え、そうでなければ1に設定します。また、 'readline()'を何度も何度も繰り返し使用することは、これを行う素晴らしい方法ではありません。ファイル全体を 'read()'し、手動で移動するインデックスとして変数を使うことができます。また、アカウントの行の長さがすべて同じであるため、必要なすべての行を ' read(correct_number_of_chars) 'を実行し、新しい行に分割します。 'rstrip()'もあなたを減速させています。 –
@Justin Peelご協力いただきありがとうございます。 – Jason
@ジャスティンピールちょっと、私はあなたのヒントのためにAC、ありがとうございます。ところで、psycoモジュールを使ってプロセスを関数にラップしないのは私のせいです。 – Jason