ノードxは複数のsubstringに対応するが、それは下のように最短のものがベースとなり、そこの頭に1文字ずつ追加してできる感じの文字列の集合になっている。
ある区間に含まれる値の種類数を求める問題である。この問題は以下のコメントのように解くことができる。
重複を除去するためになるべく右側に置いておく、という考え方がこの問題でも使えるので抑えておきたい。とはいっても、知らなくてもさほどの問題はないだろう。
まずクエリ全体を右端をキーにしてソートする。文字列を 文字ずつ末尾に追加していき、クエリの右端と一致したタイミングで計算を行う。
つなぐだけ。当然ではあるが、link(x,y)を呼び出す前に を指していなければならない。y の位置次第ではポテンシャルが激増してしまうが、今回はポテンシャルが激増するような使われ方はしないので問題ない。
親が同一パスに含まれていた場合は でうまくいく。ただし はしていないので、x の上にスプレー木がある可能性がある。そのため、切ったときに親ポインタの張替えが必要なことに注意。
親が同一パスにない場合は、親は で結ばれているはずなので親ポインタを にするだけでよい。
大分見た目が変わっているが以下のコードを機械的に書き換えたに過ぎない。