Binary String Copying
link
对一个0 / 1串进行排序 类似于001010111 只需要对高亮的部分进行排序就可以,记录一下有多少个这样的区间,就是答案的个数
需要注意的是类似于 000011111这样的字符串是不需要变的记成P{-1,-1}就可以
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
int n, m;
std::cin >> n >> m;
std::string s;
std::cin >> s;
std::set<std::pair<int, int>> S;
std::vector<int> lst(n, -1), nxt(n, n);
for (int i = 1; i < n; i ++) {
if (s[i] == '0') {
lst[i] = i;
}
else {
lst[i] = lst[i - 1];
}
}
for (int i = n - 2; i >= 0; i --) {
if (s[i] == '1') {
nxt[i] = i;
}
else {
nxt[i] = nxt[i + 1];
}
}
while (m --) {
int l, r;
std::cin >> l >> r;
l --, r --;
l = nxt[l], r = lst[r];
if (l > r) {
l = r = -1;
}
S.insert({l, r});
}
std::cout << S.size() << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}