Giới thiệu
Vì vậy, tôi đã lãng phí thời gian của mình một lần nữa để nghiên cứu các thuật toán sắp xếp hậu tố, đánh giá các ý tưởng mới bằng tay và bằng mã. Nhưng tôi luôn đấu tranh để nhớ các loại hậu tố của tôi! Bạn có thể cho tôi biết loại hậu tố của tôi là gì?
Còn lại - gì nhất?
Rất nhiều thuật toán sắp xếp hậu tố (SAIS, KA, dwar riêng của tôi) nhóm hậu tố thành các loại khác nhau để sắp xếp chúng. Có hai loại cơ bản: S-type và L-type hậu tố. Hậu tố loại S là hậu tố ít hơn về mặt từ vựng ( S maller) so với hậu tố và loại L sau nếu nó lớn hơn về mặt từ vựng ( L arger). Một loại S hầu hết bên trái ( loại LMS ) chỉ là: Hậu tố loại S được đặt trước bởi hậu tố loại L.
Điều đặc biệt về các hậu tố kiểu LMS này là một khi chúng ta sắp xếp chúng, chúng ta có thể sắp xếp tất cả các hậu tố khác theo thời gian tuyến tính! Điều đó thật tuyệt phải không?
Các thách thức
Cho một chuỗi giả sử nó bị chấm dứt bởi một ký tự đặc biệt nhỏ hơn bất kỳ ký tự nào khác trong chuỗi đó (ví dụ nhỏ hơn cả byte rỗng). Xuất ra một kiểu corrosponding char cho mỗi hậu tố.
Bạn có thể tự do chọn char để sử dụng cho loại nhưng tôi muốn L, S and *
cho L-, S- and LMS-type
miễn là họ đều có thể in được ( 0x20 - 0x7E
).
Thí dụ
Cho mmiissiissiippi
đầu ra chuỗi (khi sử dụng L, S and *
):
LL*SLL*SLL*SLLL
Ví dụ, điều đầu tiên L
là do thực tế mmiissiissiippi$
là lớn hơn về mặt từ vựng miissiissiippi$
( $
đại diện cho ký tự tối thiểu được thêm vào):
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$ > $
Một số ví dụ khác:
"hello world" -> "L*SSL*L*LLL"
"Hello World" -> "SSSSL*SSLLL"
"53Ab§%5qS" -> "L*SSL*SLL"
Mục tiêu
Tôi không ở đây để làm phiền Peter Cordes (đôi khi tôi sẽ làm điều này trên stackoverflow); Tôi chỉ rất lười biếng nên đây dĩ nhiên là môn đánh gôn ! Câu trả lời ngắn nhất trong byte thắng.
Chỉnh sửa: Thứ tự các ký tự được cho bởi giá trị byte của chúng. Đó là phương tiện so sánh nên giống như C strcmp
.
Chỉnh sửa2: Giống như đã nêu trong đầu ra nhận xét phải là một ký tự cho mỗi ký tự đầu vào. Mặc dù tôi cho rằng sẽ được hiểu là "trả về một chuỗi" nhưng có vẻ như ít nhất 1 câu trả lời trả về một danh sách các ký tự đơn. Để không làm mất hiệu lực các câu trả lời hiện có, tôi sẽ cho phép bạn trả về một danh sách các ký tự đơn (hoặc số nguyên mà khi in kết quả chỉ trong 1 char).
Lời khuyên cho thời gian tuyến tính:
- Nó có thể được thực hiện trong 2 lần lặp tiến song song hoặc trong một lần lặp ngược duy nhất.
- Trạng thái của mỗi hậu tố chỉ phụ thuộc vào 2 ký tự đầu tiên và loại thứ hai.
- Quét đầu vào theo hướng ngược lại, bạn có thể xác định L hoặc S như thế này:
$t=$c<=>$d?:$t
(PHP 7), trong đó$c
char hiện tại$d
là loại trước và$t
loại trước. - Xem câu trả lời PHP của tôi . Ngày mai tôi sẽ trao tiền thưởng.
c++
chuỗi kiểu. Hãy nghĩ về nó như là dữ liệu nhị phân.
*
nghĩa là gì?
*
có nghĩa là hậu tố tương ứng là loại left most s-type
. A S-type suffix that is preceeded by a L-type suffix.
.