結果

問題 No.3001 ヘビ文字列
ユーザー 白寧杰
提出日時 2025-01-07 11:56:09
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,808 bytes
コンパイル時間 636 ms
コンパイル使用メモリ 82,904 KB
実行使用メモリ 351,004 KB
最終ジャッジ日時 2025-01-07 11:58:36
合計ジャッジ時間 144,360 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 24 WA * 10 TLE * 49
権限があれば一括ダウンロードができます

ソースコード

diff #

#!/usr/bin/env pypy3

def main():
    s = input()
    len_s = len(s)
    is_prime = True
    min_execution = 2000000
    min_result = ""

    for m in range(2, len_s):
        if len_s % m == 0:
            is_prime = False
            n = len_s // m
            unit_result = ""
            concat_unit_result = ""

            for i in range(m):
                # A〜Z のカウント用配列 (0〜29 の30文字分)
                unit = [0] * 30
                for j in range(n):
                    # s[m*j + i] がどの文字かカウント
                    unit[ord(s[m*j + i]) - 65] += 1

                # unit 配列内でカウントが最大の文字を探す
                temp_max = 0
                temp_index = 0
                for k in range(30):
                    if unit[k] >= temp_max:
                        temp_max = unit[k]
                        temp_index = k

                # 最大カウントの文字を部分文字列として追加
                unit_result += chr(temp_index + 65)

            # 上で求めた部分文字列を n 回繰り返し
            concat_unit_result = unit_result * n

            # 元の文字列 s との差分をカウント
            count_difference = 0
            for i in range(len_s):
                if s[i] != concat_unit_result[i]:
                    count_difference += 1

            # 差分が最小となるものを記録
            if count_difference < min_execution:
                min_execution = count_difference
                min_result = concat_unit_result

    # もし最初から割り切れる m がなければ s の長さは「素数」扱い
    if is_prime:
        result = s[0] * len_s
        print(result)
    else:
        print(min_result)

if __name__ == "__main__":
    main()
0