주제 링크 : https://www.luogu.org/problem/P5410
질문 의도되는 두 캐릭터 A, B에, 접미어마다 최대 프리픽스 길이를 찾는 B A
분석 : (또한 Z-알고리즘 알고리즘으로 알려진) 확장 KMP 베어 제목
: 블로그는 더 설명하기 https://www.luogu.org/blog/lc-2018-Canton/solution-p5410
그러나 그는 몇 가지 문제에 대해 이야기 여러 장소 안에 주로 경우 2,가
우선, 스타트 S [K +의 L은, 확실히 명백 P의 돌아
사례 2 빨강, 파랑, 녹색, 다음 같은, 빨간색하지 않은 세 줄을 순서와 녹색 여전히 동일하지만 대기하지 않습니다 파란색 선이 나 자신을 살펴
#INCLUDE <비트 / STDC ++ H.> 은 USING 공간 STD, 타입 정의 긴 롱 LL; CONST의 INT MAXN = + 1E5 7. ; // 자간 자신의 기호 약간 확대 추가 CONST LL INF = 1E18 단계; #DEFINE meminf (A)가 memset (A는 0x3F입니다, sizeof의은 (A)) #DEFINE MEM0 (A)가 memset (A, 0, sizeof의 (A)) 는 char A [MAXN 같이, B는 [MAXN] INT의 NXT는 [MAXN 같이, [MAXN] 확장; // NXT [I] 주제 B [I ... LEN] B는 최대 프리픽스 길이는 연장 [I]을 나타내는 A [I ... 렌] 및 최대 프리픽스 길이 B의 공극 getnxt () { INT LEN = 나 strlen (B) NXT [ 0 ] = LEN; //[0] LEN에 대해, 물론, NXT 원래 문자열 사건 INT 지금 = 0 ; 그동안 ([현재] == B [지금 + B (1). 이제 && + 1. <LEN) 이제 ++ ; NXT는 [ . 1 ] = 현재; INT P0 = . 1 ; // . P0 1 만족 P0의 NXT [P0] -1- + 극대점 초기화의 시작 을 위해 ( int로 I = 2 ; I 렌 <; I는 ++가 ) { IF (I는 NXT [P0-I를] <+ + P0 NXT [P0]) NXT가 [I]가 = NXT [I- P0]; // I + 1을 k로 대응 NXT [I- P0]가 L에 대응한다 (NXT [K-P0 + 2) 캐릭터는 0 내지 시작 작은 증가 1 시작 블로그의 차이 밖의 { INT 지금 NXT = P0 + [P0를] - I; 지금최대 = (현재, 0 ); // 防止난后面피의在的을 하면서 지금 (B [현재] == B [지금 +] && 지금 <LEN +) ++ ; NXT [I] = 현재; P0 = 1; // 更新P0 } } } 공극 exkmp () { getnxt (); INT LEN = strlen 함수 (a); int로 지금 = 0 ; 동안 (a [현재] == B [현재] && 이제 <분 (strlen 함수 (a) 나 strlen (b))) 지금 ++ ; [확장 0 ] = 현재; INT P0 = 0 ; 대한 ( INT I = 1 ; i가 LEN <; 난이 ++ ) { 경우 (전 NXT를 + [I-P0가] <확장) [P0]을 확장 P0 + [I] = NXT [I- P0]; 또 { INT 지금 = P0 + 연장 [P0] - I; 지금 = 최대 (지금, 0 ); 반면 현재 ++ ([현재] == B A <나 strlen (b) && 지금 + <LEN 지금 [I 해주기 +] &&) ; [I]으로 연장 =를 지금; P0 = I; } } } INT 의 main () { 는 scanf ( " % S %의 S " A, B); exkmp (); 대한 (int로 I = 0 ; I는 (b) 나 strlen <; 내가 ++)의 printf ( " %의 D " , NXT [I]); putchar ( " \ n을 ' ); 위한 ( int로 I = 0 ; i가 (a) 나 strlen <; 내가 ++)의 printf ( " %의 D " 확장 [I]); putchar ( " \ n을 ' ); 반환 0 ; }