给定二进制字符串0和1以及如何找到从索引l到r的子串数,其中l和r在查询(Q)中给出,使得从l到r它具有至少k 1&0和#0。我有一个O(n ^ 2)解决方案,但这里的查询大约是10 ^ 5,所以如何解决这个问题。 例如:给定字符串01110000且k = 2,因此对于l = 2,r = 4答案为5且l = 5,r = 8答案为7.
答案 0 :(得分:0)
离线O(n + q)
- 时间解决方案的简要草图。
按开始和结束索引查询。对于按递增顺序排列的每个职位l
,我们可以确定最大r
,以使l..r
成为有效的子字符串。 r
中的l
不会减少,因此需要时间O(n)
。保留有效子字符串的累积计数。扩展此循环,以便每当我们将r
移动到查询的右端点时,我们将累积计数添加到其答案(最初为零),并且当我们将l
移动到a的左端点时查询,我们从答案中减去累计计数。查询有一些特殊情况逻辑,它们本身就是有效的子字符串,我将其留作练习。