結果
問題 |
No.252 "良問"(良問とは言っていない (2)
|
ユーザー |
![]() |
提出日時 | 2025-04-24 12:30:59 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,614 bytes |
コンパイル時間 | 443 ms |
コンパイル使用メモリ | 81,912 KB |
実行使用メモリ | 194,048 KB |
最終ジャッジ日時 | 2025-04-24 12:32:32 |
合計ジャッジ時間 | 4,027 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 WA * 1 MLE * 2 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read().split() T = int(input[0]) cases = input[1:T+1] for S in cases: lenS = len(S) first_good = None first_problem = None # Find first occurrence of "good" for i in range(lenS - 3): if S[i] == 'g' and S[i+1] == 'o' and S[i+2] == 'o' and S[i+3] == 'd': first_good = i break # Find first occurrence of "problem" for i in range(lenS - 6): if S[i] == 'p' and S[i+1] == 'r' and S[i+2] == 'o' and S[i+3] == 'b' and S[i+4] == 'l' and S[i+5] == 'e' and S[i+6] == 'm': first_problem = i break if first_good is not None and first_problem is not None and first_good < first_problem: print(0) continue # Precompute cost_good and cost_problem cost_good = [] good_starts = [] for i in range(lenS - 3): cost = 0 if S[i] != 'g': cost +=1 if S[i+1] != 'o': cost +=1 if S[i+2] != 'o': cost +=1 if S[i+3] != 'd': cost +=1 cost_good.append(cost) if cost == 0: good_starts.append(i) cost_problem = [] problem_starts = [] for j in range(lenS - 6): cost = 0 if S[j] != 'p': cost +=1 if S[j+1] != 'r': cost +=1 if S[j+2] != 'o': cost +=1 if S[j+3] != 'b': cost +=1 if S[j+4] != 'l': cost +=1 if S[j+5] != 'e': cost +=1 if S[j+6] != 'm': cost +=1 cost_problem.append(cost) if cost == 0: problem_starts.append(j) # Sort the starts lists good_starts.sort() problem_starts.sort() # Precompute problem_cost and min_suffix len_problem = len(cost_problem) problem_cost = [] for j in range(len_problem): threshold = j - 6 cnt = bisect.bisect_left(problem_starts, threshold) pc = cost_problem[j] + cnt problem_cost.append(pc) # Create min_suffix min_suffix = [float('inf')] * (len_problem + 1) # padding at the end if len_problem > 0: min_suffix[len_problem - 1] = problem_cost[len_problem - 1] for j in range(len_problem - 2, -1, -1): min_suffix[j] = min(problem_cost[j], min_suffix[j+1]) else: min_suffix = [float('inf')] min_total = float('inf') len_good = len(cost_good) for i in range(len_good): threshold = i - 3 cnt_good = bisect.bisect_left(good_starts, threshold) j_min = i + 4 if j_min > len_problem - 1: continue current_min = min_suffix[j_min] total = cost_good[i] + cnt_good + current_min if total < min_total: min_total = total if min_total == float('inf'): # Check if there's any possible j after i without the j >= i+4 constraint # But according to problem statement, |S| >=11, so there must be a solution # So this case should not happen print(-1) else: print(min_total) if __name__ == "__main__": main()