def can_arrange(N, K, S, T): # インデックスiの部員がどの連結成分に属するかを記録 component = [-1] * N component_id = 0 # 連結成分を求める for i in range(N): if component[i] != -1: continue # BFSで連結成分を探索 queue = [i] component[i] = component_id while queue: current = queue.pop(0) # current+K番目と繋がっている場合 if current + K < N and component[current + K] == -1: component[current + K] = component_id queue.append(current + K) # current-K番目と繋がっている場合 if current - K >= 0 and component[current - K] == -1: component[current - K] = component_id queue.append(current - K) component_id += 1 # 各連結成分ごとに、元の並びと目標の並びを抽出 original_components = [[] for _ in range(component_id)] target_components = [[] for _ in range(component_id)] for i in range(N): comp = component[i] original_components[comp].append(S[i]) # 目標の並びから、各ユーザー名がどの連結成分に属するか特定 user_to_component = {} for i in range(N): user_to_component[S[i]] = component[i] for i in range(N): comp = user_to_component[T[i]] target_components[comp].append(T[i]) # 各連結成分内で、元の並びと目標の並びが一致するか確認 for i in range(component_id): if sorted(original_components[i]) != sorted(target_components[i]): return False return True