この問題はグラフにおける連結成分の探索を問います。

この問題の特徴は、問題における操作に、表向きにするトランプの番号に連結性が見られることです。

ii 回目に表向きにする操作を行って得られた数字を BiB_i として、これを全体で nn 回行うことで長さ nn の数列 B=(B1,B2,,Bn)B=(B_1,B_2,\dots,B_n) を作るとします。
ただし nn は本問題の答えとなる「表向きにする操作が可能な回数における、あり得る最大値」となります。

このとき B1B2BnB_1\to B_2\to \dots\to B_n という操作をすることが可能になります。つまり

  • 最初に選んだトランプに書かれた数字 B1(=x)B_1(=x) において、22 回目に表向きにしたトランプに書かれた数字は B2(=Bx=BB1)B_2(=B_x=B_{B_1}) であった
  • 22 回目に表向きにしたトランプに書かれた数字 B2(=x)B_2(=x) において、33 回目に引いたトランプに書かれた数字は B3(=Bx=BB2)B_3(=B_x=B_{B_2}) であった
  • (他も同様)

ということになり、確かに全体の操作において連結性を持つことが分かります。
これより、nn としてあり得るものはこの連結数が最大となるものを選べばよいことになります。

目標は定まりましたが、ではどのようにしてこの最大の「サイクル」を探せばよいでしょうか?

ここでは連結性を利用して、各トランプを頂点とする次のような有向グラフ GG を作ることを考えてみます。

  • Gp:=G_p:= トランプ pp に対して操作を行ったときに得られる数(すなわち、トランプ pp の裏に書かれている数)※2

つまり、p=1,,Np=1,\dots,N に対してトランプ pp からトランプ GpG_p への有向辺を張ることになります。

結果的にこのグラフ GG は、複数のサイクルから構成されるものとなることが、前に述べた操作の連結性からも確認できます。
このサイクルに含まれる頂点数が最大のものを選ぶことで、nn の目標(最大の連結数)を達成することができます。

厳密には GG において mm 個のサイクル C1,C2,,CmC_1,C_2,\dots, C_m が存在しているとすると、求めるものは max(C1,C2,Cm)\max (|C_1|,|C_2|\dots, |C_m|) となります。
ここで C|C| とは、サイクル CC に含まれる頂点の個数を表します。

以上から、次の手続きを行うことでこの問題の答えを求めることができます。

  • 頂点 ii に対して頂点 AiA_i への一方向な辺を張ったグラフ GG を作る
  • GG にあるサイクルのうち、サイクルに含まれる頂点数が最大のものを採用する

この方針で実装を行うことで、計算量は O(N)O(N) となり十分高速です。

UnionFindを用いた実装例(C++)は以下になります。
この場合の計算量はアッカーマンの逆関数 α(N)\alpha(N) を用いて O(Nα(N))O(N\alpha(N)) となります。

※1
結局どの要素からめくろうと、最後までめくるだけめくったとき、あり得る BB の長さは明らかに最大となるためです。
このような BB は複数存在することに注意してください。これは(有向)グラフとして見做したときサイクルが複数存在することを表してます。

※2
これは制約 AA(1,2,,N)(1,2,\dots,N) の順列であることから、GpG_p は唯一の値として定まります。