結果

問題 No.3109 Swap members
ユーザー k-kuwata
提出日時 2025-05-14 18:29:42
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
AC  
実行時間 768 ms / 2,000 ms
コード長 1,932 bytes
コンパイル時間 375 ms
コンパイル使用メモリ 12,160 KB
実行使用メモリ 44,032 KB
最終ジャッジ日時 2025-05-14 18:30:04
合計ジャッジ時間 19,856 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 52
権限があれば一括ダウンロードができます

ソースコード

diff #

# -*- coding: utf-8 -*-
import collections

def solve():
    """
    部員たちを目標の整列にできるかどうかを判定する関数。
    """
    # N (部員の数) と K (入れ替えの間隔) を読み込む
    n, k = map(int, input().split())

    # 初期状態のユーザーネームリスト S を読み込む
    s_list = [input() for _ in range(n)]

    # 目標状態のユーザーネームリスト T を読み込む
    t_list = [input() for _ in range(n)]

    # K で割った余りごとにグループ分けするためのリストを準備
    # s_groups[j] は、インデックスを K で割った余りが j である部員の初期リスト
    # t_groups[j] は、インデックスを K で割った余りが j である部員の目標リスト
    s_groups = [[] for _ in range(k)]
    t_groups = [[] for _ in range(k)]

    # 初期状態 S をグループ分け
    for i in range(n):
        remainder = i % k  # インデックス i を K で割った余り
        s_groups[remainder].append(s_list[i])

    # 目標状態 T をグループ分け
    for i in range(n):
        remainder = i % k  # インデックス i を K で割った余り
        t_groups[remainder].append(t_list[i])

    # 各グループについて、初期状態と目標状態の部員の集合が一致するか確認
    possible = True
    for i in range(k):
        # collections.Counter を使って、リスト内の各要素の出現回数を比較する
        # 順序は問わないため、Counterオブジェクト同士の比較で集合として等しいか判定できる
        if collections.Counter(s_groups[i]) != collections.Counter(t_groups[i]):
            possible = False
            break  # 一つでも一致しないグループがあれば、目標達成は不可能

    if possible:
        print("Yes")
    else:
        print("No")

if __name__ == '__main__':
    solve()
0