ABC264

6完。勉強になるセットっすね。いやこういう実力が出るセットつらいよ。自分の無能さをこれでもかと見せつけられる。

A - "atcoder".substr()

substrを使う勇気がなくてループ回しながら出力した。A問題は無思考で書ける方針を考えるゲーム。

B - Nice Grid

けっこう時間かかるけど、実力的に仕方ないという感じ。最初に思いついたのは、正方形を順番に描いて実際にこの図を構成してしまう方法。それを書きかけて、チェス盤距離じゃんと気づいた。

C - Matrix Reducing

苦手。10個の中から5個を選ぶのがパターン数としては最大。それを2乗しても10万行かないので全探索できる。next_permutationの2重ループ。かなりきつい実装。どこを削除するか決めたうえで一致するか確認するパートが一番難しい。B側で普通にループ回してA側のインデックスは(削除するところを0、使うところを1で表して)0の間インクリメントするようにした。2次元の内側の変数を外側で初期化していてWA。サンプル(手元では通ってから提出している)が通ってなかったので、RE系のミスと推測できてすぐ修正できた。

D - "redocta".swap(i,i+1)

あの重厚なCからのめっちゃ簡単そうなD。ということで、けっこう確認した。まず"atcoder"には同じ文字が複数回現れない。転倒数を考えると、1回のswapで1しか変化しない。Sの各文字が"atcoder"の何文字目かを求め、それの転倒数を愚直に2重ループで求める。

E - Blackout 2

具体的にどうするかイメージがぼやぼやだけど逆からUnionFindで解けそうなので書いていく。辺を保存し最終的に切れないものだけつなぐ。最後に切れたものから順につないでいって都度答えを保存する。UnionFind内では、都市と発電所の数を管理し、2個をつなぐときに、発電所と一緒にいる都市の数を2個それぞれ引いて、つなげた1個のぶんを足す。

解説を見たら発電所は同一視できるって。なんで気づかないんだ。いやまああれで解けてるから思いつきづらいんだけど。

F - Monochromatic Path

かなり難しい。まず解ける気がしない。しばらく考えると、操作しながら移動すればDPできる可能性を感じなくもない。「既に通ったマスに影響する操作はしない」としたい。各マスについて、そのマスに影響する操作は2つ。それぞれ操作するかしないかで4通り。メモリがすごいことになりそうだが、まあ200MBは行かないので(実行時間的にも)大丈夫。注目しているマスを含め左上のマスたちはそこへ影響する操作を終えている。そこから下へ移動するとき、色が同じなら下の位置の行操作するかも同じ、色が違うなら行操作するかどうかも違う。そうやって(操作するならコストを足して)配る遷移をする。xorがたくさん出てきてややこしい。

G - String Fair

つかみどころがなさすぎる。30分もないので通すまで行けないのは仕方ないとしても、何もわからないのは悲しい。終了が近くなって、前の2文字の状態を持ってグラフにすることを思いつく。ベルマンフォードとか最小費用流とか考えたけど、間に合わないまたはできない。ベルマンフォードといってもそんなに全部回す必要あるかなとかダイクストラはどうなるとか考えて、基礎をしっかりやってないのがもろ弱みになってるのを実感した。

(追記)最後の3文字で26^3個の頂点と思ってたけど26^2でよかった(各頂点から26通りの辺が出ていてそれが3文字目を表す)。それならベルマンフォード。ベルマンフォードは過去の自分のコードを見たらわかりやすかった(というか何度もわかんなくなって「どういうアルゴリズムだっけ」と見直してる)。Nを頂点数として、最初のN-1回が終わったらそのあとの更新はInfinityを意味する(未到達の頂点からは更新しない)。実装上、存在しないzの次の文字を1個加えるか、aを0ではなく1にして0を無にするかで迷う。後者を選択。前者はT_iの長さで分ける必要が出てやめた。後者も、aと、無を含んだ__aをちゃんと区別する必要があった(サンプル通らず)。頂点数は27^3で、それぞれから有向辺が26本出てる。