わりと全般的に難しかったでござる。
解法は、ABCの序盤問題なこともあり全探索と容易に想像できるが、計算量がやや厳しく O(N!NK) となる。
NK の部分は正確には K(N−K+1)2 なので、最大となる N=10,K=6 などとして見積もると 5×107 となり、遅い言語ではやや厳しい。
せめて実行時間制約を3秒にしてクレメンス。
Pythonの itertools.permutations では、例えば 'aab' だと 'a' の位置を入れ替えただけのものが複数回、返されてしまう。
実質的に同じ並びに関しては2回以上判定処理を行わないようにすると、1/2、1/6、1/24などの定数倍がかかり、間に合う。(同じかどうかの判定に追加の計算が必要となるが)
しかし、最初から全て別の文字の場合はこれが効かない。
ただしその場合、制約上、回文になるものはないので、N! そのものを出力すればよい。
このような場合分けをすれば、なんとかギリギリで通る。
提出一覧では、Pythonでも1秒未満で通してる方々も居るので、どういうことをしているのか確認してみる。
まぁ、いろいろ書いたが、結局、数値リストにし、forループでチェックするという「PyPyフレンドリーな書き方」にするのが一番大事そう。
まず以下を調べる。
rev(a)は、aを文字列として逆から読んだ数を表すとする。
また、いずれの数も'0'は含まないもののみに限るとする。
i=1~√N の範囲で、①は i と Ni を、②は a=i の場合を調べればよい。
回文判定に桁数分の計算量がかかるので、O(√NlogN) で列挙できる。
②を使ったり使わなかったりして(同じものを複数使う場合も含め)再帰的に試していき、最終的に①に含まれるものが残れば成功。