D. String Deletion (双指针)

思路:双指针。

如果开始的前缀和 > 1 >1 >1,就直接对该前缀操作,否则找到后面个数大于1的删一个。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int t,n;
char s[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%s",&n,s);s[n]='#';
		int x=s[0]-'0',cnt=0;
		vector<int>v;
		for(int i=0;i<=n;i++){
			if(x==s[i]-'0') cnt++;
			else v.pb(cnt),x^=1,cnt=1;
		}
		int l=0,r=0,ans=0;n=v.size();
		while(l<=r&&r<n){
			if(v[l]>1){
				l++;
			}
			else {
				while(r<n){
					if(v[r]==1){
						r++;
					}
					else break;
				}
				if(r<n){
					v[r]--;
				} 
				else l++,r--;
				l++;
			}
			ans++;
			while(r<l) r++;
		}
		printf("%d\n",ans);
	} 
	return 0;	
}