首先解释一下用到的几个数组。
数组sa:构造完成前表示关键字数组,下标表示名次,值表示关键字的首字符位置,值相同的时候名次根据在原串中相对位置的先后决定;构造完成后表示后缀数组,下标表示名次,值表示后缀的首字符位置。
数组x:表示rank数组,下标表示关键字的位置,值表示关键字大小(rank),相同的值有相同的rank。初始化为字符串r的每个字符大小(此时x并不代表rank,只借助其值比较相对大小)。在每次迭代后,根据sa重新赋值,并代表rank。
数组y:排序后的第二关键字数组,下标表示名次,值代表第二关键字的首字符位置。
for(i = 0; i < m; i++)
ws[i] = 0;
for(i = 0; i < n; i++)
ws[x[i] = r[i]]++;
for(i = 1; i < m; i++)
ws[i] += ws[i-1];
for(i = n-1; i >= 0; i--)
sa[--ws[x[i]]] = i;
这段代码是计数排序,是对每个字符排序用来初始化数组sa和x。这段代码不难懂,原理我就不讲了,重点在于这个计数排序有个特点:
先根据x的值排序,x值相等时根据出现先后次序排序。
for(j = 1,p = 1; p < n ; j <<= 1,m = p)