정의
[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] 샌디 카드