这个问题取自去年的 acm 比赛。问题:
p给定长度的字符串k <= 1000- 这个字符串被无限重复,现在我们取第一个
n < 10^9字符。让我们调用结果字符串s。
任务是查找字符串的唯一子串的计数s。
计算不同子串的传统方法是 suffix + lcp 数组,但我们需要 O(n) 来构造它们(使用最快且非常复杂的构造算法)。而在构建完这些数组之后,我们还需要做很多进一步的处理,所以我认为这个解决方案不能满足时间要求。
我已经阅读了问题分析,但我根本不明白。当然它工作得很好,但他们是怎么做到的呢?这里是:
如果
p = tt...t对于某些字符串t,请替换p为t. 现在让我们假设 p 是非周期性的。f(n)s—长度为前缀的唯一子串计数n。让我们假设
n > 2k. 然后f(n) = f(n-1)+k。<- 为什么?其背后的逻辑是什么?
证明:
- let
t是 的后缀s。 如果
|t| <= n - k, thenl也包含在左侧 k 个符号上的 s 中。- if
|t| > n - k, thenl仅作为后缀包含在 s 中。
- if
因为
n<=2k问题无论如何都可以解决。
对此问题分析或您自己的解决方案的任何解释都非常感谢!我不明白我怎么能想出那个函数 f()。这几天一直在想这个问题。