hdoj3746 (NEX 어레이 부 최소 사이클을 찾는 알고리즘 KMP)

항목 링크 : HTTPS : //vjudge.net/problem/HDU-3746

질문의 의미 : 적어도 추가 문자열을 감안하면 전체 문자열이 순환 얼마나 많은 양 끝 요소가되도록 요청합니다.

아이디어 :

  NEX의 KMP 어레이의 특성을 적용 어레이 최소 사이클 부 L = 렌 NEX-[LEN]이고 , 증거 참조 http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html한다.

  렌 %의 L == 0 인 경우, 출력 0.

  그렇지 않으면, 출력 L-렌 % L.

AC 코드 :

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘>
 사용  스페이스 성병; 

CONST의  INT maxn 1E5 + = 5 ;
INT T, LEN, NEX [maxn];
문자 S [maxn]; 

보이드 get_next () {
     INT의 J; 
    J = NEX [ 0 ] = - 1 ;
    위한 ( int로 I = 1 ; i가 <렌; ++ I) {
         동안 (j> - 1 ! && S [I] = S [J + 1 ]) J = NEX [J]
        경우 (S [I] == S [J + 1 ]) ++제이; 
        NEX은 [I] = J 단계; 
    } 
} 

INT 의 main () { 
    는 scanf ( " %의 D ' , T);
    반면 (T-- ) { 
        는 scanf ( " %의 S ' , S); 
        LEN = 나 strlen (S); 
        get_next (); 
        INT T1 len- = 1 , T2 = NEX [T1];
        경우 (T2에 == - 1 ) { 
            의 printf ( " % D \ 없음 " 렌); 
        } 
        다른 {
             INT의 T3 = len- (T2 + 1);
            만약 LEN (%의 T3의 == 0 ) { 
                (의 printf " 0 \ n " ); 
            } 
            다른 { 
                의 printf ( " % D \ 없음 " , T3-LEN의 %의 T3); 
            } 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/FrankChen831X/p/11788184.html