Puntero doble lío alrededor.
Si la longitud del prefijo igual más larga es mayor que 1, la operación elimina directamente un número de este prefijo y luego el sistema elimina este prefijo.
De lo contrario, busque la última subcadena igual mayor que 1 y elimine un número en esta subcadena, y luego el sistema elimina el prefijo igual de longitud 1.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int n,a[maxn];
char s[maxn];
int main() {
int _;
scanf("%d", &_);
while (_--) {
scanf("%d", &n);
scanf("%s", s + 1);
s[n + 1] = 'a';
int cnt = 1, num = 0;
for (int i = 2; i <= n + 1; i++) {
if (s[i] == s[i - 1]) {
cnt++;
} else {
a[++num] = cnt;
cnt = 1;
}
}
if (num == 1) {
printf("1\n");
continue;
}
int ans = 0;
int l = 1, r = 1;
while (l <= r && l <= num) {
if (a[l] >= 2) {
ans++;
l++;
} else {
while (r <= num && a[r] == 1) {
r++;
}
if (r <= num && a[r] >= 1) {
a[r]--;
l++;
} else {
l++;
l++;
}
ans++;
}
while (r < l) r++;
}
printf("%d\n", ans);
}
return 0;
}