#729. 循环平衡字符串

循环平衡字符串

循环平衡字符串

题目描述

考虑一个由字符 01 组成的字符串 t=t1t2tmt=t_1t_2\ldots t_m。我们称字符串 tt 的相邻字符对为 t1t2,t2t3,,tm1tmt_1t_2, t_2t_3, \ldots, t_{m-1}t_m,以及 tmt1t_mt_1。最后一对将字符串末尾与开头相连,因此总共恰好考虑 mm 对。如果字符串只包含一个字符,则只考虑 t1t1t_1t_1 这一对。

我们称字符串 tt 是循环平衡的,如果在其相邻字符对中,00011011 的数量相等。

一个二进制字符串的代价为使其变为循环平衡所需插入的最少字符数。字符可以插入在任意位置,包括第一个字符之前和最后一个字符之后。不允许删除或替换原有字符。

给定一个二进制字符串 ssqq 个查询。每个查询给定下标 llrr,求子串 slsl+1srs_l s_{l+1}\ldots s_r 的代价。

输入格式

第一行包含两个整数 nnqq1n,q3×1051 \le n, q \le 3 \times 10^5),分别表示字符串长度和查询次数。

第二行包含字符串 ss,长度为 nn,由字符 0 和/或 1 组成。

接下来 qq 行,第 ii 行包含两个整数 lil_irir_i1lirin1 \le l_i \le r_i \le n),表示对应查询的子串边界。

输出格式

输出 qq 个整数,第 ii 个整数表示第 ii 个查询的子串代价。

样例输入

11 7
00111100000
1 8
1 1
1 2
1 4
3 6
2 7
7 11

样例输出

4
3
2
0
4
2
7

样例解释

对于第一个查询 l=1,r=8l=1, r=8,子串为 00111100。按循环顺序写出相邻字符对:

0001111111100000

统计得到 0033 个,0111 个,1011 个,1133 个。四类数量不相等,因此原串不平衡。

为了使字符串达到循环平衡,最终长度必须是 44 的倍数,并且每类相邻字符对的数量都等于最终长度的四分之一。当前长度为 88。如果保持长度 88,则每类需要 22 对,但 0011 已经各有 33 对,所以不可行。将长度增加到 1212 需要插入 44 个字符。例如可以在原串的第二个 1 后插入 00,在末尾后插入 11,得到 001100110011,该串中 00011011 的数量均为 33,满足循环平衡。因此最少需要插入 44 个字符,代价为 44

数据范围

  • 1n,q3×1051 \le n, q \le 3 \times 10^5
  • 1lirin1 \le l_i \le r_i \le n
  • 字符串 ss 长度为 nn,仅包含字符 01