ABC343

6完。結果だけ見れば普通だけど、内容が悪すぎる。競プロに飽きているからパフォーマンスが出ないという説はある。

A - Wrong Answer

言われたとおりに全探索。これ1分切れないのは仕方ない。!(a + b) は思いつきたいけどちょっと難しい。問題名見てなかったな。

B - Adjacency Matrix

素直に出力していくだけ。その場では行の終わりがわからないので、その行で初めての出力でないときはスペースを入れるという処理をする。出力すべき番号がない場合でも改行はする必要があることに注意する。

C - 343

立法数自体が少ないので全部確認すればよい。回文かの確認もto_stringしてreverseというので間に合う。

D - Diversity of Scores

mapで何が何個あるか持つやつ。そういやunorderdでもよかったのか。

E - 7x7x7

やばめの構築?いや、343^3で全探索できる?などという印象だった。まず2つの立方体の共通部分の体積の求め方を考える。次元を下げて考えると区間の共通部分で(最初2次元で考えていたが1次元でいいんだなあ)、これは区間の右端の最小値と左端の最大値の差でわかる(0以上)。たぶんこれを3方向についてやって積をとればいい。次に全探索の方法を考える。共通部分がちょっとだけあって3個つなげるとけっこう広い空間を使うため、定数倍の重い3乗は間に合わない。立方体1個を固定したら2乗でいけそうだ。一辺が21の立方体の中で全てが作れそうなのでそれを確認する。3個全部つながっているときは大丈夫。2個と1個に分かれるときは一辺が14の立方体と一辺が7の立方体に分ければいい。全部バラバラもOK。1個を固定するのは、真ん中に固定して、それではみ出すならずらせば一辺が21の立方体に入るからOK(これも連結成分の個数で場合分けして考える)。確認できたので、各立方体の隅の座標が0から14まで全探索。15通りの6乗が10^7程度なので間に合う。実装はきつい。迷うけど、6重ループにした。あと、3つの立方体の共通部分の体積も知る必要があった。これも同様のコードを書けばいいが、慎重に1文字も間違えないように書くのは大変。あとは包除みたいにして計算。3個重なっていたら体積を3倍カウントするみたいなイメージで(7^3)*3になるか検算。

F - Second Largest Query

区間だしさすがにセグ木しかないだろうと当たりを付ける。問題文はちゃんと読んでいたがいつの間にか脳内で意味が変わって、2番目に「多い」値になっていた。頻度をmapで持ってマージテクのようなことを考えて、実装もして、更新が無理だと気づく(実装するまで気づかないのが弱い)。しばらくして「2番目に大きい値ならセグ木でできるじゃん」と気づく。じゃあその値が指定された区間に何個あるかもわかるか?値毎に位置をmapを持ってと思ったが、個数はわからない(これに気づくのにも時間がかかっている)。で、2番目に大きい値がセグ木でわかるなら個数も普通にわかると気づく(ここでようやく「大きい」と「多い」の勘違いをしていたと明示的に気づく)。セグ木の実装がめちゃくちゃきつい。同じ値はまとめる必要があるのが大変すぎる。2つのノードの2つずつの値(4個)をsortしてuniqueして(もし2個に足りなければ0を入れて)これでOKと思ったら個数もまとめる必要がある。if文を8個並べて、同じ値だったら足すというのをやった。2番目が1番目になることはないので少し減らせるけどそういうことをする余裕はない。しかし書き上がってもサンプルが全然合わない。ソートでgreater<>()が必要だったけど、uniqueは一致するかしか見てないから必要ないんだよなとか言いながら一応greater<>()を入れてしまっていた。よく考えたら一致判定を不等号2回でやるわけがない。そこは一致するかどうかを判定する関数を指定する場所だった。

G - Compress Strings

atcoder::z_algorithmを使うことを考える。完全に含まれる場合は含まれる側を消してしまえばいい。2つの文字列を連結してz_algorithmを使えば、完全に含まれるかどうかも、完全に含まれる以外でどの位置で重ねることができるかもわかる(どっち側からつなげるかで2通りやる(2重forでやるだけ))。文字列の左端の位置が左のものから追加していくことにすれば、完全に含まれるケースがないとしていいことから、最後に何を追加したかが同じなら同じ状況になるのでDPできる。実装上は、完全に含まれるものを消さずに、貰うDPで(含まれるなら最後の文字列が変化しないので)貰う人を変化させる、配るDP風の実装になった(常にpopcountが小さいものから貰うので大丈夫(DAGになっている))。何度となく書いているdp[(1 << n) - 1]を誤ってdp[1 << n]と書いて気づかないなど、酷いミスが多い。z_algorithmを使う部分も難しく、コード量を増やして安定をとったつもりが間違っていた。