AOJ 1145 : 全宇宙生命ゲノムデータベース

The Genome Database of All Space Life | Aizu Online Judge

構文解析の問題。
一つ困るのが繰り返しの処理。

繰り返したときの文字列の長さを持っておいて、
それよりiが小さければ中の長さでmodを取って遷移し、
そうでないときはiから文字列の長さを引いて
次の文字列を見ていく。

f:id:arukuka:20170614051922p:plain
サンプルの3番目のケース。
例えばi < 28ならi' = i % 14(一つ下の階層の長さ)とする。
サンプルでは28 <= iなのでi'=i-28をし、
i' < 10(Cの繰り返し)なのでi'' = i' % 1(Cの長さ)とする。

最大ケースについて、
sとして100文字与えられ、繰り返しの最大は1000ということなので、
最大 999^(100/5) ~= 10^60 くらいになる。
BigInteger を使うという手もあるかもしれないが、
スマートではない。

i に注目すると最大でも 10^6 までしか与えられないことが分かる。
i より大きい数でmodを取っても結果は i なので繰り返した文字列の長さが
10^9を超えたら「超えましたフラグ(sourceではoverに該当)」を
立てておいて、その間は無視すれば良い。
なぜ10^9にしたかというと、iの最大10^6 x 繰り返しの最大 10^3 なので
それぐらいにしておけば十分だと思ったため。

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=2368595#1

書き方が悪かったのか、処理がだいぶ面倒だった。
どうすればきれいになるか……。