#579(DIV。3)ラウンドCF

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)

 原則として最後の質問のサンパウロの並べ替え:

ソート+バックパック、古典的なマッチ

 

おすすめ

転載: www.cnblogs.com/waldenlake/p/11361462.html