Official

A - Apparently Make UTPC Editorial by Mitsubachi


$N = |X| + |Y| + |Z|$ とします.$C$ の中で $A$ である区間と $B$ である区間の関係に基づいて場合分けを行います.

[1] 包含している場合

\(B\)\(A\) を含む場合,\(B\) を含めば良いです.すなわち,\(1\) 種類のものを含む問題と考えられます.

この場合,\(C_i\)\(B\) の前に置くか後ろに置くかは \(C_i\)\(B_1\) の大小によります.ただし,\(B_1\) と同じ値をどちらに置くかは場合分けが必要です.\(2\) 通り試して良い方を採用する,という形でも構いません.

[2] 独立な場合

\(A\)\(B\) のどちらを左に置くかを全探索します.実際には辞書順で小さい方を左として構いません.

この場合,\(A, B\) の左側に何を置くかは [1] の形で処理できます.残りについても,同様に [2] の形で処理できます.

[3] 重なる場合

[2] と同様に \(A\)\(B\) のどちらを左に置くかを全探索します.

重なる要素の数の候補を調べます.これは Suffix Array や LCP Array などで行えます.

重ねる要素の数が決まれば,[1] の形に帰着できます.最適な重ねる数を求めることを考えます.

これは,左側に置きたい要素の数が最大となる中で,重ねた結果の辞書順が最小のものを取れば良いです.これは二分探索と Suffix Array や LCP Array などで行えます.

全体で \(O(N)\)\(O(N \log N)\) などで解くことができます.

おまけ: WA が出た方向けにテストケースを \(1\) つ置いておきます.

入力例
3
4 6 7
3 2 1 1
5 3 2 1 1 1
1 5 2 4 1 1 3
3 4 8
4 4 4
4 4 3 1
4 2 4 1 4 3 2 4
16 17 32
1 5 3 5 2 5 3 5 4 5 3 5 2 5 3 5
5 3 5 2 5 3 5 4 5 3 5 2 5 3 5 7 8
1 7 8 5 3 5 2 5 3 5 4 5 3 5 2 5 3 5 3 5 2 5 3 5 4 5 3 5 2 5 3 5

出力例
4 5 3 2 1 1 1
2 2 4 4 4 3 1 4
1 5 3 5 2 5 3 5 4 5 3 5 2 5 3 5 2 5 3 5 4 5 3 5 2 5 3 5 7 8 3 5

posted:
last update: