algorithm - ACM 问题 : Number of distinct substrings of long string

标签 algorithm language-agnostic

<分区>

这道题取自往年的acm竞赛。 问题:

  • 给定字符串 p长度k <= 1000
  • 这个字符串重复无限次,现在我们先取 n < 10^9人物。让我们调用结果字符串 s .

任务是找到字符串 s 的唯一子串的计数.

计算不同子串的传统方法是后缀 + lcp 数组,但我们需要 O(n) 来构造它们(使用最快且相当复杂的构造算法)。并且在构造完这些数组之后我们还需要做很多进一步的处理,所以我认为这个解决方案不符合时间要求。

我看过问题分析,但我完全不明白。当然它工作得很好,但他们是如何做到的呢? 在这里:

  • 如果 p = tt...t对于一些字符串 t , 替换 pt .现在让我们假设 p 是非周期性的。

  • f(n)s 前缀中唯一子串的计数长度n .

  • 我们假设 n > 2k .然后 f(n) = f(n-1)+k . <- 为什么?这背后的逻辑是什么?

证明:

  • ts 的后缀.
  • 如果 |t| <= n - k , 然后 l也包含在左侧 k 个符号上的 s 中。

    • 如果|t| > n - k , 然后 l仅作为后缀包含在 s 中。
  • n<=2k无论如何都能解决问题。

非常感谢对此问题分析或您自己的解决方案的任何解释!我不明白我怎么能想出这个函数 f()。这几天一直在思考这个问题。

最佳答案

我收集到 k 是非周期性输入字符串 p 的长度。对于给定的长度 l,最多有 k 个长度为 l 的不同子串,因为每两个子串的起始位置是全等模 k 是相同的。 p 是非周期性的关键结果是它的 k 旋转都是不同的,这意味着给定一个长度至少为 k 的子串,我们可以使用它的长度-k前缀,一个p的旋转,来确定子串模k的起始位置。因此,对于 [k, n-k+1] 中的所有 l,我们知道恰好有 k 个长度为 的不同子串我。对于[n+1-k, n]中的所有l,恰好有n+1-l个子串。对于[0, k)中的所有l,我们使用通常的技术进行计数。

关于algorithm - ACM 问题 : Number of distinct substrings of long string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57991833/

相关文章:

algorithm - 给定数组和键,求其左右子数组中小于或等于自身的元素个数?

algorithm - 在 rabin-karp rolling hash 中选择基数和模素数

c++ - all_of 函数检查数组部分所有元素的条件

基于偏好的分组算法

algorithm - 蛋糕比较算法

algorithm - "spacify"CamelCased 字符串的算法

java - 处理一个大文本文件需要多长时间?

java - 找到打开所有灯泡的最少开关数

git - 如何配置 Visual Studio 代码以在保存时提交到 git?

database - 将日志消息存储在数据库表中而不是文件中是好是坏?