如何在这里应用动态编程?

时间:2012-10-21 13:43:12

标签: c++ algorithm logic dynamic-programming

我正在处理问题http://www.spoj.pl/problems/DISUBSTR/ 给定一个字符串,我们需要找到其不同子串的总数。

Input

T- number of test cases. T<=20;
Each test case consists of one string, whose length is <= 1000

Output

For each test case output one number saying the number of distinct substrings.

Example

Sample Input:
2
CCCCC
ABABA

Sample Output:
5
9

    Explanation for the testcase with string ABABA: 
    len=1 : A,B
    len=2 : AB,BA
    len=3 : ABA,BAB
    len=4 : ABAB,BABA
    len=5 : ABABA
    Thus, total number of distinct substrings is 9.

我使用后缀数组的盲目实现解决了这个问题。但是,我想用动态编程来解决它。但是我无法想到任何方法。此外,时间复杂度需要为0(n * n)或更快。请任何人都可以指导我正确的方向任何提示/建议/伪代码都会受到高度赞赏。我一直在思考它但是想不出任何DP方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

我认为你不能用动态编程解决这个问题,因为没有最优的子结构。知道字符串的一部分的答案并没有告诉你任何关于该部分的信息+例如另一个字符。

可以通过在trie中插入字符串的所有后缀然后计算其节点数来解决问题。这是O(n^2),并且最有可能通过如此短的字符串获得AC。更有效的方法涉及使用后缀数组(O(n log n))并在O(n)中构建后缀树。