文字列を反転して条件を言い換えると、文字列に関する問題の条件は次のようになる。(添え字はPython風に表している)
- のprefixにの最後の1文字を除いたものが含まれ、
- さらにの最後の1文字がのそれ以降に存在する
1つ目の条件だけ考える場合、事前にTrieを作っておけばをprefixとして含むような文字列の総数は高速に数えられる。この時、をTrieで辿った際の終端ノードに2つ目の条件に関する情報があれば、うまく数えられそうに見える。具体的には、そのノードの部分木に含まれる文字列でを含んでいるものの数が記録されていれば、2つ目の条件も満たすものが数えられる。
そこで、配列をの子に属する文字列で以降に文字を含むものの総数、と定めて、Trieの各ノードに持たせればよい。
アルファベットのサイズをとするとき、この配列は各ノードについてならしで作れるので、全体の計算量は。(一つの子ノードについて、親への遷移はちょうど1回で、遷移の計算量が。)