【题解】CF1672H Zigu Zagu
很简单一道 H,如果放在 F 前面可能会有 1k 人通过。
首先每次删除一定是极长合法串,所以一定是 \(\overline{x|x\cdots y|y}\) 中的 \(\overline{x\cdots y}\)。
显然如果 \(x=y\),等于将两个 \(|\) 合并成一个 \(|\),如果 \(x\neq y\),就是将两个 \(|\) 同时删掉。
其中 \(|\) 表示的是 \(a_i = a_{i+1}\) 的断点,那么我们把 \(a_i\) 记为 \(|\) 的颜色。那么每次操作相当于删除一个断点,或者删除两个颜色不同的断点。所以答案就是两个颜色中更多的断点数量 \(+1\)。
时间复杂度 \(\mathcal{O}(N)\)。
#define N 200005
int n, q, a[N], b[N]; char s[N];
int main() {
read(n, q);
scanf("%s", s + 1);
rep(i, 2, n){
if(s[i] == s[i - 1]){
if(s[i] == '1')a[i] = 1;
else b[i] = 1;
}
}
rp(i, n)a[i] += a[i - 1], b[i] += b[i - 1];
while(q--){
int l, r; read(l, r);
int x = a[r] - a[l], y = b[r] - b[l];
printf("%d\n", max(x, y) + 1);
}
return 0;
}