问题 D: 最早连续串

内存限制:524 MB 时间限制:2 S
题面:传统 评测方式:文本比较 上传者:
提交:4 通过:2

题目描述

给定一个 0101 串 SS 代表 fan 神 cf 的 Only public activity,00 代表当天休息,11 代表当天有提交。

fan 神认为,连续的 00 或者连续的 11 是有特殊效果的。比如多摆几天水平下降的比间歇性摆下降的快。

现在 fan 神想知道,最早出现长度是 kk 的全 00 串或全 11 串的开头下标是多少 。即找到最小的 pp,满足 SpSp+1…Sp+k−1SpSp+1Sp+k1 都是 00 或 11,如果存在这样的 pp,fan 神会在这之后把 SpSp+1…Sp+k−1SpSp+1Sp+k1 这个串翻转(00 变 1111 变 00)。如果不存在连续 kk 个要求的字符输出 −11 即可。

注意:会存在多次询问,并且翻转的操作会对之后的询问产生影响。


为了防止输入过大带来的常数问题,C++ 选手请尽量使用关闭流同步的 std::cin 和 std::cout 实现输入输出,否则可能出现因读入输出问题导致的 TLE 等。

int main(){
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);

  // your code

  return 0;
}


				



				



				

输入格式

第一行一个整数 TT (1≤T≤1000)(1T1000),表示测试数据组数。

对于每一组测试数据,第一行包含一个由 0101 构成的一个字符串 SS (1≤∣S∣≤5×105)(1S5×105)(下标从 11 开始)。

第二行包含一个整数 qq (1≤q≤5×105)(1q5×105) 代表询问次数。

接下来 qq 行,每行包含两个整数 op,kop,k (1≤k≤∣S∣,op=0,1)(1kS,op=0,1),代表寻找 kk 长度的全 opop 串。

保证所有测试数据的 ∣S∣S 之和和 qq 之和均不超过 106106

输出格式

对于每组数据,输出 qq 行,每行一个整数表示每个询问的答案。

输入样例 复制

2
00110
5
0 1
1 2
1 3
0 4
0 1
101000000
2
0 3
1 4

输出样例 复制

1
3
-1
2
-1
4
3