题目解析
首先,我们先明确这份代码解决的核心问题: 给定一个长度为 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;
}

京公网安备 11010502036488号