확장 로스 KMP 밸리 P5410 템플릿

주제 링크 : 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 ; 
}

 

추천

출처www.cnblogs.com/qingjiuling/p/11391630.html