Series_205 のいろいろ

クソ記事の掃きだめ

ABC171 - F を余事象からアプローチする

本番で「簡単じゃーん」とか言ってたら、解説と違う解法だったので

F - Strivore

言いかえ・余事象

操作を逆から見ると、「長さ|S|+Kで、部分列にSを持つ文字列」の個数を求めればいいことがわかります。(Editorialではこれを直接求めていますが、僕にはこれを直接求めるのが困難に感じたので、余事象を考えました。)

余事象を考えると、「長さ|S|+Kで、部分列にSを持たない文字列T」の個数がわかればいいです。

余事象を解く

Lを、「Tの部分列かつSの接頭辞である最長の文字列の長さ」とします。

0\le L \lt |S|なので、各LについてO(1)で求められれば良いです。

p_iを、「p_{i-1}\lt jかつT_j=S_iとなる最小のj」とします。

pの選び方は{}_{|S|+K}C_L通りあります。

Tpとして採用されないindex iの、文字の選び方を考えます。i\lt p_jとなる最小のjを考えたとき、S_{p_j}T_iとして使えません。

逆にそれ以外の文字は使えるので、26-1=25通りの文字を選べます。

よって、各Lについて{}_{|S|+K}C_L\times 25^{|S|+K-L}を足し合わせればいいです。

コード:Submission #14557607 - AtCoder Beginner Contest 171

おわり

なんか説明が苦手なので駄文になってしまった気がしています。

考察はどっちが楽かわかりませんが、僕には余事象の方が簡単に感じます。あと、実装は明らかにこっちのほうが楽です(どっちでも楽だろ)。