给定一个字符串,在所有它的唯一子字符串的排序(按字典顺序)序列中将是原始字符串的等级。 例子 - abc 唯一排序的子串序列是 - a,ab,abc,b,bc,c。所以它的排名是3。 有没有比生成所有唯一子串更好的方法,并在排序后找到它的排名。我使用set stl来解决这个问题,并且超出了时间限制。
答案 0 :(得分:0)
答案 1 :(得分:0)
首先,构建给定字符串的suffix array。
例如,如果字符串为“ABABA”,则其后缀数组sa[]
和高度数组height[i]=LCP(sa[i],sa[i-1])
将为:
| i | sa[i] | height[i] |
| ---- | ----- | --------- |
| 1 | A | 0 |
| 2 | ABA | 1 |
| 3 | ABABA | 3 |
| 4 | BABA | 0 |
| 5 | BA | 2 |
您可以看到ABABA
之前的每个子字符串都属于后缀数组中ABABA
之前的后缀。例如:
A
,属于sa[1]
。A
,AB
和ABA
属于sa[2]
。但是重复了第一个子串。A
,AB
,ABA
,ABAB
,ABABA
属于sa[3]
。但是重复了前3个子串。因此,如果整个字符串在后缀数组中排名为#n
,那么答案将为:
\sum_{i=1}^{n} length(sa[i]) - height[i]
所以“ABABA”的答案是1+3+5-1-3=5
。
您可以获得此问题的完整源代码here。没有经过全面测试,但它应该有效。