题目解析

首先,我们先明确这份代码解决的核心问题: 给定一个长度为 n 的二进制字符串 s,要求将字符串调整为交替二进制串(即相邻字符不同,如 0101... 或 1010...),计算最少需要修改的字符数量(代码中通过统计不匹配的字符并计算最小调整成本实现)

核心思路

交替二进制串只有两种合法模式: 模式 1:偶数位(0 开始计数)为 0,奇数位为 1(010101...) 模式 2:偶数位为 1,奇数位为 0(101010...)

代码的核心逻辑是: 分别统计原字符串与两种模式不匹配的字符数量 计算每种模式下调整这些不匹配字符的最小成本 最终取两种模式的最小成本作为答案

变量定义: c1/c2 用于临时计数,sum1/sum2 记录两种模式的总成本,str1/str2 存储与两种模式不匹配的字符

代码演示:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
const int N = 500010;

void solve(){
	int n;
	cin>>n;
	string s,str1,str2;
	cin>>s;
	int c1=0,c2=0,sum1=0,sum2=0;
	for(int i=0;i<n;i++){
		if((i%2==0&&s[i]=='0')||(i%2==1&&s[i]=='1')) str1+=s[i];
	}
    
    
    //遍历 str1 中的不匹配字符,通过 c1/c2 统计调整所需的最小操作数:
//遇到 1:优先抵消已有的 c1(0 的计数),无则增加 c2(1 的计数)
//遇到 0:优先抵消已有的 c2(1 的计数),无则增加 c1(0 的计数)
	for(int i=0;i<(int)(str1.length());i++){
		if(str1[i]=='1'){
			if(c1==0) c2++;
			else{
				c1--;
				c2++;
			}
		}else{
			if(c2==0) c1++;
			else{
				c2--;
				c1++;
			}
		}
	}
	sum1=c1+c2;
	c1=0,c2=0;
	for(int i=0;i<n;i++){
		if((i%2==0&&s[i]=='1')||(i%2==1&&s[i]=='0')) str2+=s[i];
	}
	for(int i=0;i<(int)(str2.length());i++){
		if(str2[i]=='1'){
			if(c1==0) c2++;
			else{
				c1--;
				c2++;
			}
		}else{
			if(c2==0) c1++;
			else{
				c2--;
				c1++;
			}
		}
	}
	sum2=c1+c2;
	cout<<min(sum1,sum2)<<endl;
}

signed main(){
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	int T=1;cin>>T;
	while(T--){
		solve();
	}
	return 0;
}