https://codeforces.com/contest/1203/problem/D2
이 문제 해결 방안은 욕심 관찰을 기반으로합니다.
사고의 가장 일반적인 용도 중 하나는, 건축 사진, 대답과 같은 질문이 아닌 질문에 대한 답에 대한 답을 찾습니다
대답이 경우 우리가 조각을 제거 시간 (L, R)의 경우 (난, r은)이며, 그것은 리터가 더 이상 왼쪽을 확장 할 수 있다는 것을 의미, r은 오른쪽으로 더 확장 할 수 없습니다. T는 반드시 왼쪽 절반은 오른쪽 R 구성의 L 부분으로 구성되어 의미한다.
바로 나올 준비. t는 각각, 찾을 = 'ABC' ''+ 'ABC', '의 경우 는'+ 'BC', 'AB C'+ '를', 'ABC'+ ' 이 과거에있어서, 상기 중간 부의 최대 길이를 찾는 방법. a는 창을 밀어되지 않도록! 그러나 우리는 창 밖 성격보다는 속성 창,하지만 같은 동작 우려하고있다.
구체적으로 수행하는 방법 :
의이 목록 [부울] 이러한 위치 중 하나를 표시 (만 레코드 목록 진짜야 위치 [INT] 실제로 더 나은로하지만, 코드를 변경하지 않으)의 첫 번째 t의 각 요소의 위치를 찾을 수 기록했다. 위치 L에리스트 [BOOL]를 대응하는 위치에, 그 다음, R은 최종 위치 (S)의 우측에 해당 초기화되고, 즉, 문자 t 먼저 'ABC'+ '이 경우, 좌측 절반을 발견하고 방전 지금 "ABC"+ ''솔루션입니다. 이어서 'AB'+ 'C'를 찾고, 난 이 유효한 솔루션의 문자를 포함하는 오른쪽 R 'C'까지 오른쪽, 왼쪽 위치로 이동한다. 마지막 줄까지.
코드 :
= S의 INPUT () T = 입력 () DEF GET (S, T) 의 Nd = 0 DP = FALSE] * 렌 (S) #의 기록 여부를 특정의 현재 위치 에 대한 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) GET R & LT = LEN (S)를 -. 1 ANSR = - (L) 에 대한 (C) 의 반전 (t) L - 1 = 동안 L> = 0 및 DP [L] == 거짓 : L - = 1 동안 ! S (R) = C : R - 1 개 = R - = 1 ANS = 최대 (ANS, R - l) 인쇄 (ANS)
원칙적으로 마지막 질문의 상 정렬 :
정렬 + 배낭, 고전적인 일치