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:
