思路
设 cnt(c) 为字符 c 在字符串 s 中的出现次数。
首先,如果 cnt(0)=cnt(1),任意在 s 中删掉一个字符肯定不优。
然后如果 cnt(0)=cnt(1),任意在 s 中删掉一个字符就变成了 cnt(0)=cnt(1) 的情况。
所以,如果 cnt(0)=cnt(1),答案就是 min(cnt(0),cnt(1)),否则答案就是 2n−1(如果 cnt(0)=cnt(1),n 必定为偶数)。
代码
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int t, n, cnt0, cnt1;
char ch[200001];
int main(){
scanf("%d", &t);
while (t --){
scanf("%s", ch + 1);
n = strlen(ch + 1);
cnt0 = cnt1 = 0;
for (int i = 1;i <= n;i ++) cnt0 += ch[i] == '0', cnt1 += ch[i] == '1';
if (cnt0 == cnt1) printf("%d\n", cnt0 - 1);
else printf("%d\n", min(cnt0, cnt1));
}
}