학습 알고리즘 : 파업의 접미사 배열 높이

정의

[LCP] 의 전체 이름이 가장 긴 일반적인 접두사, 두 접미사 사이의 가장 긴 접두사, 우리는 다음을 정의

최장 프리픽스 및 접미사 LCP (I, J)를 의미한다 i와 j

 

함수 [Z] 함수 Z [I]는 문자열의 최장 프리픽스 및 서 픽스 I를 나타내고

 

 


 

 [문제점]

모두이 문제를 해결했다

즉, 접미사 사이 긴 일반적인 접두사와 접미사 문자열을 추구

 

그러나 뭔가 다르다

접미사 배열 결국 그 결정 최장 프리픽스 일반적인 사전 적 접미사 i 번째 난 + 1 번째 접미사

Z 기능 마침내 결정 그 문자열의 긴 공통 프리픽스 및 서 픽스 I

 

그런 다음 가장 긴 일반적인 접두사에 의해 다른 값을 찾을 수

 


 

[학습 알고리즘

접미사 배열 []

  접미사 배열은 N 시간에 얻을 수있다 전적으로 i 번째와 제 i - 1 긴 공통 프리픽스 접미사

  그리고이 기능은 일반적으로 높이라는 이름 

  높이를 의미 [I]를 들면 긴 공통 프리픽스와 i 번째의 접미사의 접미사 - 사전 식 I

  얻어진 다음의 특성을 갖는다 : (들 [i]는 i 번째의 접미사를 나타낸다)

  1. 난 J보다 작 으면, LCP (I, J) = {분 LCP (K - 1, K), 난 + 1 <= K <= J}

  LCP는 RMQ이 수요를 활용할 수 있습니다

  i 번째 접미사 전적으로 그의 전방 및 접미사 LCP부터 2. 다음은 H [i]를 정의

  即: H [I] = 높이 [랭크 [I]

  이어서, 거기에 I> 1 랭크 [I]> 1  

   H [i]는> H [I - 1] - 1;

   

  다음과 같이 인증 :

  접미사 순위 위치의 전방에 착수하기 시작 접미사 1 - j는 제 I이고

  참고 : j는 처음 내가 아니다 - 2

  이 경우, 접미사 j 번째 및 I - LCP의 확장자에 제 1 높이에서 정의 된 랭크를 [I - 1], 즉 H [I - 1]

  즉 증명하기 위해 우리의 오른쪽 절반의 일부입니다

  다음 우리는 J + 1을 논의하고 난 (제 i 의해 얻어진 - 1 + 1)의 관계 :

  우선 J 및 I,시 - 1 문자가 동일하지 않은, 시간 [전 - 1] 0

  분명히 다음 시간 [I]> H [I - 1] 1 -

  둘째, J 나는 경우 - 1 케이스의 첫 글자와 같은지,  

  분명히 다음, J 및 I - LCP 1 시간 [전 - 1] - 1

  나는 시험보다 접미사 순위, 나는 LCP에서 가장 긴, 가장 높은 유사성이 그에게서 최근에 그 멀리 SA에 분명히 접미사에서

  즉 SA [rank [i - 1]] - 1 

  즉, H의 [I]> = H이다 [I - 1] 1 -

  QED

  

  그래서 우리는 시간에서 사용할 수있는 가장 긴 접두사를 찾을 때마다 [난 - 1] 검색 시작

  유사 manacher인가

  다음과 같이 코드입니다 :

보이드 GetHeight () {
     INT의 J, K = 0 ;
    위한 ( int로 I = 1 , N = 1이 <; 내가 ++ ) {
         경우 (K) k-- ;
        INT J = SA [RAK [I] - 1 ];
        반면 (S [I + K] == S [J + K]) K ++ ; 
        높이 [RAK [내가] = K; 
        의 printf ( " % D \ 없음 " , K); 
    } 
}

 

 


 

주제 :

 

[SDOI 2008] 샌디 카드

 

 

 

  

 

추천

출처www.cnblogs.com/rentu/p/11338901.html