三井住友信託銀行プログラミングコンテスト2019 D - Lucky PIN
与えられた文字列S(0~9のみ)から、3桁のパスワードをいくつ作れるか?という問題です。
ここで、Sの桁数が最大30000桁になるため、Sの3重ループをしようとするとTLEになってしまいます。
発想を逆転させて、3桁のパスワードを全列挙させて、それらがSから作れるかを試すのがよいです。
3桁のパスワードは103のため、十分に間に合います。
N = int(input()) S = input() ans = set() for i in range(10): i_index = S.find(str(i)) if i_index == -1: continue for j in range(10): j_index = S.find(str(j), i_index+1) if j_index == -1: continue for k in range(10): k_index = S.find(str(k), j_index+1) if k_index == -1: continue ans.add("{}{}{}".format(i, j, k)) print(len(ans))