소개
그래서 나는 접미사 정렬 알고리즘을 연구하면서 새로운 시간을 수작업으로 코드로 평가하면서 다시 시간을 낭비했습니다. 그러나 나는 항상 내 접미사의 유형을 기억하려고 노력합니다! 내 접미사가 어떤 유형인지 알려줄 수 있습니까?
가장 왼쪽?
많은 접미사 정렬 알고리즘 (SAIS, KA, 내 자신의 daware) 그룹 접미사를 정렬하기 위해 다른 유형으로 접미사를 그룹화합니다. 기본 유형에는 S 유형 과 L 유형 접미사가 있습니다. S- 타입 접미어는 다음 접미어보다 사전 어휘 적으로 작은 ( S maller) 접미어이고 L 이 큰 경우 ( L arger) L- 타입입니다. A는 가장 왼쪽 S 형 ( LMS-타입 )이며 단지하십시오 S 형 a로 덧붙일 접미사 L 형 접미사.
이 LMS 유형 접미사 에 대한 특별한 점은 일단 정렬하면 다른 모든 접미사를 선형 시간으로 정렬 할 수 있다는 것입니다! 굉장하지 않습니까?
도전
주어진 문자열은 해당 문자열의 다른 문자보다 작은 특수 문자 (예 : 널 바이트보다 작은 문자)로 종료한다고 가정합니다. 각 접미사에 대해 유형 부식 문자를 출력하십시오.
어떤 유형에 어떤 문자를 사용할 것인지 자유롭게 선택할 수 있지만 모두 인쇄 할 수있는 한 선호 L, S and *
합니다 L-, S- and LMS-type
( 0x20 - 0x7E
).
예
주어진 문자열 mmiissiissiippi
출력 (을 사용할 때 L, S and *
) :
LL*SLL*SLL*SLLL
예를 들어 첫 번째 L
는 mmiissiissiippi$
사전 식보다 큰 사실 때문입니다 miissiissiippi$
( $
추가 된 최소 문자를 나타냄).
L - mmiissiissiippi$ > miissiissiippi$
L - miissiissiippi$ > iissiissiippi$
* - iissiissiippi$ < issiissiippi and preceeded by L
S - issiissiippi$ < ssiissiippi$
L - ssiissiippi$ > siissiippi$
L - siissiippi$ > iissiippi$
* - iissiippi$ < issiippi$ and preceeded by L
S - issiippi$ < ssiippi$
L - ssiippi$ > siippi$
L - siippi$ > iippi$
* - iippi$ < ippi$ and preceeded by L
S - ippi$ < ppi$
L - ppi$ > pi$
L - pi$ > i$
L - i$ > $
몇 가지 예 :
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
골
나는 Peter Cordes를 성가 시게 여기에 있지 않습니다 (언제나 스택 오버 플로우 에서이 작업을 수행 할 것입니다). 나는 매우 게으르다. 그래서 이것은 물론 코드 골프입니다 ! 바이트 단위의 최단 답변이 이깁니다.
편집 : 문자의 순서는 바이트 값으로 제공됩니다. 즉, 비교는 C와 같아야합니다 strcmp
.
Edit2 : 주석 출력에서 언급 된 것처럼 각 입력 문자에 대해 단일 문자 여야합니다. "문자열 반환"으로 이해한다고 가정했지만 적어도 하나의 답변이 단일 문자 목록을 반환하는 것으로 보입니다. 기존 답변을 무효화하지 않기 위해 단일 문자 목록 (또는 인쇄 할 때 1 문자 만 정수)을 반환 할 수 있습니다.
선형 시간에 대한 팁 :
- 2 병렬 순방향 반복 또는 단일 역방향 반복으로 수행 할 수 있습니다.
- 각 접미사 상태는 처음 두 문자와 두 번째 문자에만 의존합니다.
- 입력을 역방향으로 스캔하면 L 또는 S를 다음과 같이 결정할 수 있습니다.
$t=$c<=>$d?:$t
(PHP 7),$c
현재 문자$d
는 이전 문자 및$t
이전 유형입니다. - 내 PHP 답변을 참조하십시오 . 내일 나는 현상금을 수여 할 것이다.
c++
스타일 문자열의 경우 null 바이트) 이진 데이터로 생각하십시오.
*
뜻입니까?
*
은 해당 접미사가 유형 임을 의미합니다 left most s-type
. A S-type suffix that is preceeded by a L-type suffix.
.