String 使用atmost k 1'计算子字符串;s和0';s

String 使用atmost k 1'计算子字符串;s和0';s,string,algorithm,String,Algorithm,给定一个由0和1组成的二进制字符串,如何找到从索引l到r的子字符串数,其中l和r在查询(Q)中给出,因此从l到r有大气K1和0。我有一个O(n^2)解决方案,但这里的查询大约为10^5,因此如何解决这个问题。 例如:给定字符串01110000和k=2,因此对于l=2,r=4的答案是5,l=5,r=8的答案是7。非常简短的脱机O(n+q)-时间解决方案草图 按开始和停止索引查询。对于每个位置l的递增顺序,我们可以确定最大r,这样l..r就是一个有效的子字符串r在l中不减损,因此这需要时间O(n)。

给定一个由0和1组成的二进制字符串,如何找到从索引l到r的子字符串数,其中l和r在查询(Q)中给出,因此从l到r有大气K1和0。我有一个O(n^2)解决方案,但这里的查询大约为10^5,因此如何解决这个问题。
例如:给定字符串01110000和k=2,因此对于l=2,r=4的答案是5,l=5,r=8的答案是7。

非常简短的脱机
O(n+q)
-时间解决方案草图


按开始和停止索引查询。对于每个位置
l
的递增顺序,我们可以确定最大
r
,这样
l..r
就是一个有效的子字符串
r
l
中不减损,因此这需要时间
O(n)
。保留有效子字符串的累积计数。扩展此循环,以便无论何时将
r
移动到查询的右端点,我们都会将累积计数添加到其答案中(最初为零),而当我们将
l
移动到查询的左端点时,我们会从其答案中减去累积计数。对于本身是有效子字符串的查询,有一些特殊的案例逻辑,我将作为练习离开。

@downvorters。我知道这个问题不符合指导原则,但是当你投反对票时,请在amalsom留下一条评论来证明它的合理性:@arunmoezhi:------这可能是投反对票的原因。这是怎么回事?不应该是n*q吗?对于每个查询,您都要检查每个位置的有效字符串l@Manish我说的是真的,但既然这是一个活跃的竞赛问题,我就不再解释了。呵呵!我知道你的意思。有人这样做过。除非你提到前向和后向预计算,否则它只会是n*q。