公式

F - Finite Bracket Sequence 解説 by miscalculation53


実は、答えが Infinite であるための必要十分条件は、\(X\) に含まれる () の個数が等しいことです。


\(X\) に含まれる () の個数が異なるとき、答えが Finite であることを示します。

\(Y\) は次のいずれかの形で書けます。

  • \(X\) のある部分文字列
  • 次の \(3\) つの文字列をこの順に連結した文字列
    • \(X\) のある接尾辞(空でもよい)
    • ある非負整数 \(k\) が存在して、\(X\)\(k\) 回連結した文字列
    • \(X\) のある接頭辞(空でもよい)

前者の長さは明らかに有限です。後者について、\(k\) を十分大きくとると、この文字列に含まれる () の個数は等しくなりえず、ゆえに正しい括弧列ともなりえないことがわかります。よって、答えは Finite です。


\(X\) に含まれる () の個数が等しいとき、答えが Infinite であることを示します。

有名事実として、\(X\) を巡回シフトした文字列であって正しい括弧列である文字列 \(Z\) が存在します。実際、次のように \(Z\) を構成できます。

  • \(A_i\)\((X[1, i]\) に含まれる( の個数\()-(X[1, i]\) に含まれる ) の個数\()\) とする。
    • ここで、\(X[l, r]\)\(X\)\(l\) 文字目から \(r\) 文字目までからなる部分文字列を表す。
  • \(A_i\) が最小となる \(i\) に対し、\(X[i+1, |X|] + X[1, i]\)\(Z\) とする。
    • ここで、\(|X|\)\(X\) の長さを表す。また、\(+\) は文字列の連結を表す。

このように構成した \(Z\) の任意の接頭辞について、\((\)( の個数\()-(\)) の個数\()\) が非負であることが確認できます。

任意の正整数 \(k\) に対し、\(Z\)\(k\) 回連結した文字列は \(Y\) として選ぶことができます。よって、答えは Infinite です。


以上で必要十分条件が証明できました。

したがって、累積和を用いて \(O(N + Q)\) 時間で解くことができます。

投稿日時:
最終更新: