【发布时间】:2013-10-05 11:22:18
【问题描述】:
我正在寻找一种可用于解决此问题的快速算法:给出 A 和 B 整数(在 [0,10^18] 范围内),并给出 N 的列表(N
示例 1:如果 A=10,B=22,并给出 N=2 个子字符串={1,10};计数为 = 11;数数:10->19 和 21。
Example2: 如果 A=175, B=201, 并给出 N=3 个子串={55,0,200} ;计数为 = 4;数数:180、190、200 和 201。
直接的方法是依次分析 [A,B] 范围内的每个整数,但这不是解决方案,因为范围可能很大(直到 10^18 个整数)。
为了降低问题的复杂性,我做的第一件事是从 N 个子串的原始列表中删除一些无用的子串,这样“没有子串包含在另一个子串中”。例如:{1,10} 变为 {1},{55,0,200} 变为 {55,0}。这不会改变最终计数。
接下来,即使假设我们可以得到 [A,B] 范围内的一个子字符串的计数,我们仍然不能将这个计数与列表中其他子字符串的计数相加,因为一个数字可以包含许多子字符串并且不应该计数不止一次。
有什么想法可以解决问题并获得想要的数量吗?
【问题讨论】:
-
+1 删除无用的子字符串
-
这个问题有时间限制吗?
-
@vbmaster,这是 ACM 编程竞赛中的一个问题,通常有几秒钟的时间限制......但实际上对我来说,即使是几分钟内的正确解决方案也是需要的......跨度>
-
下面的答案几乎是正确的,为了更清楚,你基本上需要多次申请Inclusion–exclusion principle。
-
有一种算法类似于 (i) 构造一个 DFA,该 DFA 将具有 N 之一的字符串识别为子字符串 (ii) 使用动态编程来计算匹配字符串的数量。
标签: algorithm numbers substring