Loading...
6/24/2025
与えられた文字列をTrie木に載せていくことを考える。が良い集合であることは、Trie木上で以下が成り立っていることと同値である。
このような塗り方をすべて求めれば良い。そのような塗り方を「いい塗り方」と呼ぶことにする。
が固定の場合を考える。を根とする部分木が良い塗り方であるような塗り方の総数、とする1。また、簡単のためすべての頂点は子を持たないか、ちょうど2つの子を持つかのいずれかであるとする2。
まず葉は、その頂点で終了するような文字列が存在するならばで、そうでないならばとなる。ある部分木について、
A
側の部分木B
側の部分木で計算できる。気持ちとしては、+の左側が「頂点を塗らなかった場合にその部分木が良い集合となる」場合の数、右側は(頂点を塗った場合にはその部分木は良い部分木となるので)他の頂点を塗る塗り方の場合の数を計算している。
ここで、が動的に変わる場合を考える。ある文字列をTrie木に追加したとき、変化しうる値はA側の部分木とB側の部分木のどちらか一方と、追加した文字列のパス上に存在するの値である。これは各頂点にをメモしておくことで差分計算が可能となる。
以上から、この値を載せておくことで全体でとなる。