String 给定一个字符串,原始字符串在所有它';s唯一子串

String 给定一个字符串,原始字符串在所有它';s唯一子串,string,algorithm,String,Algorithm,给定一个字符串,原始字符串在其所有唯一子字符串的排序(按字典顺序)序列中的排名是多少。 示例-abc 子字符串的唯一排序序列为- a、 ab,abc,b,bc,c。所以排名应该是3。 有没有比生成所有唯一的子字符串并在排序后找到其秩更好的方法。我对这个问题使用了set stl,并且超出了时间限制。为给定字符串构建 为该后缀数组创建数组 在后缀数组中原始字符串的位置之前计算唯一的子字符串。首先,构建给定字符串的 例如,如果字符串为“ABABA”,其后缀数组sa[]和高度数组height[i]=LC

给定一个字符串,原始字符串在其所有唯一子字符串的排序(按字典顺序)序列中的排名是多少。 示例-abc 子字符串的唯一排序序列为- a、 ab,abc,b,bc,c。所以排名应该是3。 有没有比生成所有唯一的子字符串并在排序后找到其秩更好的方法。我对这个问题使用了set stl,并且超出了时间限制。

为给定字符串构建

为该后缀数组创建数组

在后缀数组中原始字符串的位置之前计算唯一的子字符串。首先,构建给定字符串的

例如,如果字符串为“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
    ABAB
    属于
    sa[3]
    。但前3个子串是重复的
因此,如果整个字符串在后缀数组中排名为#
n
,答案将是:

\sum{i=1}{n}长度(sa[i])-高度[i]

因此,“ABABA”的答案是
1+3+5-1-3=5


你可以得到这个问题的全部源代码。虽然没有经过全面测试,但它应该可以正常工作。

要确定的是,“ABABA”的答案是什么?是5级吗?是的,排名是5级。