CF1684H Hard Cut
题目描述
给定一个 `01` 字符串 $s$。
你需要对其进行划分,使得最终把每一段当做二进制数加起来后得到的数是 $2$ 的幂。
有解输出任意一组解,无解输出 `-1`。
输入格式
第一行输入一个整数 $t(1\leq t\leq10^5)$ 表示数据组数。接下来对于每组数据:
输入一行一个 `01` 字符串 $s(1\leq |s|,\sum |s|\leq10^6)$。
输出格式
对于每组数据:
如果无解,输出 `-1`。
否则,首先输出一行一个整数 $k$ 表示划分的子段数。
接下来输出 $k$ 行,第 $i$ 行两个整数 $l_i,r_i(1\leq l_i\leq r_i\leq n)$ 表示你划分出的子段。
你划分的子段应该两两不相交,且包含 $s$ 中的每个字符。
### 样例解释
对于第二组数据,样例将 $\texttt{"01101"}$ 划分成了 $\texttt{"011","0","1"}$。
因为 $(011)_2+(0)_2+(1)_2=3+0+1=4=2^2$,因此满足要求。
说明/提示
In the first test case it is impossible to cut the string into substrings, so that the sum is a power of 2.
In the second test case such cut is valid:
- $ 011_2 = 3_{10} $ ,
- $ 0_2 = 0_{10} $ ,
- $ 1_2 = 1_{10} $ .
$ 3 + 0 + 1 = 4 $ , $ 4 $ is a power of 2.