我正在寻找一种可用于解决此问题的快速算法:给出A和B整数(范围[0,10^18]),并给出一个列表N(N < = 1000)个数字子串;目标是计算包含N个子串中任何一个的[A,B]范围内的所有数字。我们总是A < = B,数字子字符串也是[0,10^18]范围内的整数。例1:如果A = 10,B = 22,并给出N = 2个子串= {1,10};计数将是= 11;计数数字:10-> 19和21.用于在数值范围内计数子串的算法
例2:如果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用于删除无用的子字符串 – avrahamcool
这个问题是否有时间限制? – Chen
@vbmaster,这是ACM编程竞赛中的一个问题,通常是几秒钟的时间限制......但对我来说,即使是在几分钟内的正确解决方案也是需要的...... – Mounir