この問題はグラフにおける連結成分の探索を問います。
この問題の特徴は、問題における操作に、表向きにするトランプの番号に連結性が見られることです。
回目に表向きにする操作を行って得られた数字を として、これを全体で 回行うことで長さ の数列 を作るとします。
ただし は本問題の答えとなる「表向きにする操作が可能な回数における、あり得る最大値」となります。
このとき という操作をすることが可能になります。つまり
ということになり、確かに全体の操作において連結性を持つことが分かります。
これより、 としてあり得るものはこの連結数が最大となるものを選べばよいことになります。
目標は定まりましたが、ではどのようにしてこの最大の「サイクル」を探せばよいでしょうか?
ここでは連結性を利用して、各トランプを頂点とする次のような有向グラフ を作ることを考えてみます。
つまり、 に対してトランプ からトランプ への有向辺を張ることになります。
結果的にこのグラフ は、複数のサイクルから構成されるものとなることが、前に述べた操作の連結性からも確認できます。
このサイクルに含まれる頂点数が最大のものを選ぶことで、 の目標(最大の連結数)を達成することができます。
厳密には において 個のサイクル が存在しているとすると、求めるものは となります。
ここで とは、サイクル に含まれる頂点の個数を表します。
以上から、次の手続きを行うことでこの問題の答えを求めることができます。
この方針で実装を行うことで、計算量は となり十分高速です。
UnionFindを用いた実装例(C++)は以下になります。
この場合の計算量はアッカーマンの逆関数 を用いて となります。
※1
結局どの要素からめくろうと、最後までめくるだけめくったとき、あり得る の長さは明らかに最大となるためです。
このような は複数存在することに注意してください。これは(有向)グラフとして見做したときサイクルが複数存在することを表してます。
※2
これは制約 が の順列であることから、 は唯一の値として定まります。