SortAtCoder今年の解き納め問題。文字列Sが与えられる。これを「隣り合った2つの文字を入れ替える」という操作を好きなだけ行い、回文に出来るか。可能なら、捜査の最小回数を求めよ。回文を作れる⇔奇数個ある文字の種類が1個未満なので、普通にカウントしてあげてください。最小回数ですが、AtCoder解説と異なる解法です。外側から順に文字を確定していく方式。各文字の種類ごとに見た時、同じ種類同士の文字を入れ替える必要性は全く無いので、一番外側の文字のみを考えればよい。外側に動かすのに最も操作回数の少ない文字を求めて、それを貪欲に外側に持っていけばいいです。各文字の種類でdequeにその文字がある座標を埋め込むとこれが楽に実装・削除できます(通常の配列では工夫しないと、1操作でO(N)かかるので注意)。「現在どこにその文字があるか」が分からないのでそれを毎回探す必要があり、これに1回O(|S|)かかります。そこで、バブルソートの反転数でお馴染みのBitIndexedTreeを利用します。Treeでは「i以下の要素で、利用された要素数」を見つけることが出来れば、「利用した文字列は消し去るor一番右へスライドし、後は利用しない」という考え方で、dequeに格納された最初の状態から現在あるべき座標が求められます。sum(x)で求まるので、一番外側に何を持ってくればいいのか、それに何回かかるかがO(log|S|)で分かります。あとは実際に文字列を操作せず、dequeのみで管理する点に注意して、文字がなくなるまで繰り返せば最小手数が求まります。実際はBITでなくても、セグ木でも平方分割でも通りそうですが、これが一番実装楽だと思います。0;}感想ライブラリ持ってないんですよね...BITでバグらせてWA連発したのは痛かった。(Hard)Easyも全く同じコードで通るのでまとめて。...「3月中に毎日1問解いて黄色になろう!」キャンペーン8問目。Merger「3月中に毎日1問解いて黄色になろう!」キャンペーン7問目。日)ネットの海に生息するらしいバーチャルグソクムシ。競プロとCTFをメインに、たまにEsolangを混ぜます。(7)月別アーカイブリンクGitHubはてなブログをはじめよう!Hyogaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。