Câu hỏi không thúc đẩy số lượng truy vấn O(n), có vẻ như là một trường hợp xấu nhất tùy ý vì số lượng truy vấn duy nhất có thể là số lượng các cặp được đặt hàng và do đó O(n2).
Đây là hai giải pháp khác nhau với độ phức tạp thời gian tốt hơn cho O(n2)trường hợp dựa trên (hậu tố) cây hậu tố được xây dựng tăng dần với thuật toán của Ukkonen . Cả hai giải pháp đều dựa trên tiền xử lý và có độ phức tạpO(n2+ |Q|) Ở đâu Qlà tập hợp các truy vấn. Giải pháp thứ hai chạy trongO ( n + |Q|) nếu tất cả các truy vấn có cùng chiều rộng.
Giải pháp 1 - Tiền xử lý tất cả các truy vấn duy nhất
Lặp lại các hậu tố của S. Đối với mỗi hậu tốSi=S[ tôi . . n ], xây dựng cây hậu tố của STôivới thuật toán của Ukkonen. Sau khi cập nhậtj đến cây hậu tố hiện tại, lưu trữ kích thước cây trong một ma trận tại vị trí ( tôi , tôi + j - 1). Một truy vấn cho phạm vi[x,y] được trả lời bởi phần tử ma trận tại (x,y).
Kích thước cây hậu tố có thể được lưu trữ cùng với cây hậu tố và được cập nhật theo thời gian không đổi ở mỗi bước bằng cách sửa đổi quy trình cập nhật trong thuật toán của Ukkonen. Đối với mỗi bản cập nhật, kích thước tăng theo số lượng lá hiện tại.
Giải pháp 2 - Độ rộng truy vấn duy nhất tiền xử lý
Giải pháp này khó thực hiện hơn nhưng đòi hỏi ít công việc tiền xử lý hơn nếu có ít độ rộng truy vấn. Tiền xử lý mấtÔ ( n ) thời gian nếu chỉ có một chiều rộng truy vấn.
Đối với mỗi chiều rộng truy vấn w, sử dụng cửa sổ trượt có chiều rộng wvà tăng dần xây dựng một cây hậu tố. Xóa hậu tố bắt đầu một ký tự bên trái cửa sổ bằng cách xóa hậu tố dài nhất khỏi cây. Ở mỗi bước, số lượng chuỗi con hiện tại trong cửa sổ trượt là kích thước cây.
Tất cả các truy vấn sau đó có thể được trả lời trong thời gian tuyến tính bằng cách sử dụng kết quả của tiền mã hóa.
Lưu ý: loại bỏ hậu tố dài nhất có thể được thực hiện bằng cách loại bỏ lá già nhất của cây hậu tố. Nó không phải là dễ dàng để thực hiện chính xác.