Official

J - 長い長い文字列/Long Long String Editorial by QCFium


まず、以下のような数列 \(\mathrm{cnt}\) を計算します。
\(\mathrm{cnt}_i = S_1\) から \(S_i\) までのプログラムが出力する文字数。ただしこれが \(10^{15}\) より大きければ \(10^{15}\)
便宜上 \(\mathrm{cnt}_0 = 0\) とします。
この数列は前から求めていけば簡単に計算することができます。

この数列 \(\mathrm{cnt}\) を後ろから見ていったとき、\(\mathrm{cnt}_k\) で初めて \(X\) より小さい要素が出てきたとします。
この場合、\(k + 1\) 文字目の命令によって出力される文字列に答えとなる文字が含まれることになります。

  • \(S_{k + 1}\) が英小文字である場合 : その文字が答えです
  • \(S_{k + 1}\) が数字である場合 :
    この命令は \(\mathrm{cnt}_k\) 文字を繰り返し出力するので、全体で\(X\) 番目の文字は、全体で \((X - 1)\) % \(\mathrm{cnt}_k + 1\) 番目の文字と同じです (\(x\) % \(y\)\(x\)\(y\) で割った余りを表す)
    よって、\(X\)\((X - 1)\) % \(\mathrm{cnt}_k + 1\) で置き換えれば、次に \(\mathrm{cnt}\) の中で \(X\) より小さい要素が現れる位置を探して同様のことを繰り返すことができます。

このように処理をすると、最悪でも \(O(N)\) で処理ができます。

posted:
last update: