#!/usr/bin/env pypy3 def main(): s = input() len_s = len(s) # len_s の約数をすべて求める (1 と len_s 自身は除外する) divisors = [] i = 2 while i * i <= len_s: if len_s % i == 0: divisors.append(i) if i != len_s // i: divisors.append(len_s // i) i += 1 # 約数が小さい順に揃える divisors.sort() # 約数が 1 つも見つからなければ -> 素数とみなし s[0] * len_s を出力して終了 if not divisors: print(s[0] * len_s) return # ここから先は約数がある前提で、元コードのロジックを適用 min_execution = 10**15 # 適当に大きい数で初期化 min_result = None for m in divisors: # m は len_s の約数なので割り切れる n = len_s // m # 各「列」(あるいはブロック位置) ごとに、もっとも頻度の高い文字を探す # A〜Z の文字が 26 種類だけなら配列長は 26 でOK (元コードでは 30 でしたが 26 で十分) unit_result = [] for i in range(m): count_arr = [0] * 26 for j in range(n): ch = s[j*m + i] count_arr[ord(ch) - 65] += 1 # 最頻出文字 (出現回数が最大の文字) を求める max_count = -1 max_char_idx = -1 for idx, cnt in enumerate(count_arr): if cnt > max_count: max_count = cnt max_char_idx = idx # 文字に戻す unit_result.append(chr(max_char_idx + 65)) # 求めた単位文字列を n 回繰り返す unit_str = "".join(unit_result) concat_unit = unit_str * n # 元の文字列との相違数をカウント diff = 0 for i in range(len_s): if s[i] != concat_unit[i]: diff += 1 # 差分が小さいものを最適解として記録 if diff < min_execution: min_execution = diff min_result = concat_unit # 約数の中で最適解だった文字列を出力 print(min_result) if __name__ == "__main__": main()