https://codeforces.com/contest/1203/problem/D2
この問題解決のためのアイデアは、貪欲な観察に基づいています。
思考の最も一般的な用途の一つ、工事写真は、答えのように質問、ない質問への答えへの答えを探します:
答えがある場合、それは我々が断片(L、R)を取り外し、時間のとき(L、R)は、あるのそれは、lはもはや左を拡大することができないことを意味し、Rは右にさらに拡張することができません。Tは、必ずしも左半分、右Rから成るのL部分が構成さを意味します。
右に出てくるする準備ができました。Tはそれぞれ、 '+ 'ABC'、 ''見つけるため、= 'ABC'の ' + 'BC'、 'AB' + 'C'、 'ABC' + ' この過去において、中間部分の最大長さを見つけます。スライディングウィンドウことはありません!しかし、我々は、窓の外の自然ではなく、プロパティでウィンドウが、同じ動作と懸念しています。
具体的に行う方法:
sがリスト[ブール]でこれらの位置のいずれかを表示されます(レコードのみのリストトゥーレ位置[INT]実際に優れていると、コードを変更する必要はありません)に最初のTの各要素の位置を見つけます記録。まず、「ABC」+「」この場合、左半分を検索し、文字tを放電、それは、リストに対応する位置である位置L上の[ブール]が真である場合、Rは、最後の位置sの右側に初期化され、今で"ABC" + ''ソリューション。次いで「AB」+「C」を求めて、 Lが、これは有効な解決策であるの文字を含む右R「C」まで右へ、左の位置に移動しました。最後の行まで。
コード:
= SのINPUT() T = INPUT() DEF (S、T)を得る: のNd = 0 DP = [FALSE] * lenは(S) #1 レコード特定の現在の場所かどうか のために I における範囲(LEN(S)) : Cの =のS [I] IFのNd <LEN(T)と C == T [たNd]: DP [I] = 真 のNd + = 1。 IFのNd == LEN(T): リターンI、DP L、DP = (S、T)を取得 R&LT = LEN(S)を- 1 ANS= R - L のために C で反転(T): L - = 1 一方、 L> = 0 と DP [L] == FALSE: L - = 1つの 一方、 S [R] =!C: R - = 1 R - = 1つの ANS = MAX(ANS、R - L) プリント(ANS)
原則として最後の質問のサンパウロの並べ替え:
ソート+バックパック、古典的なマッチ