競技プログラミングのためのF#入門
これも基本方針は公式解説です. 自力実装ではまり倒したため, 今回はPythonコードを参考にしました.
まずは前後で文字が切り替わる番地を取得しましょう. シンプルなのは次のようなfold
処理です.
1 2 3 |
|
公式解説の後半ではいくつかややこしい条件分岐処理があります. これをシンプルに処理するために番地にN
を追加します.
1 2 3 4 5 |
|
これで公式解説で言うi_k
を要素とする配列が作れました. あとはX_k
の配列を作れば終わります.
配列を作ってからArray.max
を作っても構いません. ただ今回は添字に関する処理をしながら逐次最大値を計算していくだけで求める値が得られるため, はじめからfold
を使って処理します. 配列Ia
はN
を追加していていわば余計な項を含んでいます. このため添字に関してやや面倒な処理が必要です. 具体的には次のように書きます.
1 2 3 4 5 |
|
fold
はIa
自身ではなくIa
の添字の配列で回します. N
の追加があるため[|0..l0-1|]
とループはIa
の最後まで回らないようにします. ポイントはj
の構成です. 解説のS_{i_k} = 0 or 1
での添字の変化はint S.[Ia.[i]] - int '0'
で対応します. さらに「k>r
ならi_k=N+1
」の処理がまさにmin hoge l0
の部分です. これで添字を作ればIa.[j]
で必要な値が取れます.