A questão não motiva o número de consultas sendo , o que parece ser o pior caso arbitrário, pois o número de possíveis consultas únicas é o número de pares ordenados e, portanto, .O(n)O(n2)
Aqui estão duas soluções diferentes com melhor complexidade de tempo para o caso base em árvores de sufixos (implícitas) construídas de forma incremental com o algoritmo de Ukkonen . Ambas as soluções são baseadas no pré-processamento e possuem complexidade onde é o conjunto de consultas. A segunda solução é executada em se todas as consultas tiverem a mesma largura.O(n2)O(n2+|Q|)QO(n+|Q|)
Solução 1 - Pré-processe todas as consultas exclusivas
Repetir os sufixos de . Para cada sufixo , construa a árvore de sufixos com o algoritmo de Ukkonen. Após atualizar para a árvore de sufixos atual, armazene o tamanho da árvore em uma matriz na posição . Uma consulta para o intervalo é respondida pelo elemento da matriz em .SSi=S[i..n]Sij(i,i+j−1)[x,y](x,y)
O tamanho da árvore do sufixo pode ser armazenado junto com a árvore do sufixo e atualizado em tempo constante a cada etapa, modificando o procedimento de atualização no algoritmo de Ukkonen. Para cada atualização, o tamanho aumenta pelo número atual de folhas.
Solução 2 - Pré-processar larguras de consulta exclusivas
Essa solução é mais difícil de implementar, mas requer menos trabalho de pré-processamento se houver poucas larguras de consulta. O pré-processamento leva tempo se houver apenas uma largura de consulta.O(n)
Para cada largura de consulta , use uma janela deslizante de largura construa incrementalmente uma árvore de sufixos. Remova o sufixo iniciando um caractere à esquerda da janela e remova o sufixo mais longo da árvore. Em cada etapa, o número atual de substrings na janela deslizante é o tamanho da árvore.ww
Todas as consultas podem ser respondidas em tempo linear usando os resultados da pré-computação.
Nota: a remoção do sufixo mais longo pode ser feita removendo a folha mais antiga da árvore do sufixo. Não é fácil de implementar corretamente.