標題の問題は以下です。
https://atcoder.jp/contests/abc162/tasks/abc162_d
お伺いしたい点は3点です。
①以下のコードをpython3.8.2で提出するとTLEとなり、pypy7.3.0で提出するとACになります。言語仕様といえばそれまでですが、具体的にどこが高速化されているのかお伺いしたいです。
python
1N = int(input()) 2S = input() 3a = S.count('R')*S.count('G')*S.count('B') 4 5for i in range(N-2): 6 for j in range(i+1,N-1):#②の質問箇所 7 if S[i]!=S[j]: 8 if j+j-i<=N-1: #③の質問箇所 9 k = j+j-i 10 if S[j]!=S[k] and S[i]!=S[k]: 11 a -= 1 12print(a)
②他の方の回答例を見るとjの上限をN-1からi+(N-i-1)//2+1に変えると範囲がさらに絞れてACになるのですが、このように上限を限定できる理由をお伺いしたいです。
python
1N = int(input()) 2S = input() 3a = S.count('R')*S.count('G')*S.count('B') 4 5for i in range(N-2): 6 for j in range(i+1,i+(N-i-1)//2+1):#①からの改変箇所 7 if S[i]!=S[j]: 8 if j+j-i<=N-1: 9 10 k = j+j-i 11 if S[j]!=S[k] and S[i]!=S[k]: 12 a -= 1 13print(a)
③質問①の条件式を一部変えて、以下コードにするとpythonでもACになります。
if文の条件を満たさないために以降が実行されず次のループに行くケースと、breakによって次のループに行くケースの計算量は一般的に後者の方が速いのでしょうか。具体的になぜ速くなっているかをお伺いしたいです。
python
1N = int(input()) 2S = input() 3a = S.count('R')*S.count('G')*S.count('B') 4 5for i in range(N-2): 6 for j in range(i+1,N-1): 7 if S[i]!=S[j]: 8 if j+j-i>=N:#③の質問箇所 9 break 10 k = j+j-i 11 if S[j]!=S[k] and S[i]!=S[k]: 12 a -= 1 13print(a)
初心者質問で恐縮ですが、計算量にお詳しい方、以上3点のご回答よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー