一尘不染

使用后缀数组的最小词典旋转

algorithm

    Consider a string of length n (1 <= n <= 100000). 
    Determine its minimum lexicographic rotation. 
    For example, the rotations of the string “alabala” are:

    alabala

    labalaa

    abalaal

    balaala

    alaalab

    laalaba

    aalabal

    and the smallest among them is “aalabal”.

这是ACM ICPC 2003的问题。其他用户已经在堆栈流中提出了此问题。[但是,这并没有用,我想通过后缀Array来解决。

如何使用后缀数组解决此问题?

直到现在我做了什么??

(1)假设给定的字符串为S。

我将字符串S与自身连接起来,得到字符串S’。

即。S’= S + S。

(2)。然后我在O(nlog n)时间发现了S’的后缀数组。

For example:
    S=alabala
    S'=alabalaalabala

Suffix No. Index    Suffixes

0       13      a
1       6       aalabala
2       9       abala
3       2       abalaalabala
4       11      ala
5       4       alaalabala
6       7       alabala
7       0       alabalaalabala
8       10      bala
9       3       balaalabala
10      12      la
11      5       laalabala
12      8       labala
13      1       labalaalabala

因此,我很好地计算了后缀数组SA,SA [] = {13,6,9,2,11,4,7,0,10,3,12,5,8,1}。

我还计算了每个后缀b / w的LCP [尽管我不确定在这个问题上我会需要它]。

现在 如何进一步进行。如何使用SA获得理想的结果?

用一个很小的例子进行解释将非常 有效

谢谢!!


阅读 263

收藏
2020-07-28

共1个答案

一尘不染

似乎应该在SA中采用第一个后​​缀,该后缀的索引在0到length(S)-1之间。

一些解释:S的所有旋转都是从0到length(S)-1之间的位置在S的后缀的开头。后缀数组按字母顺序保留后缀,因此您只需要选择从S的旋转开始的第一个后缀即可。

2020-07-28