思路

cnt(c)\operatorname{cnt}(c) 为字符 cc 在字符串 ss 中的出现次数。

首先,如果 cnt(0)cnt(1)\operatorname{cnt}(\texttt{0}) \ne \operatorname{cnt}(\texttt{1}),任意在 ss 中删掉一个字符肯定不优。

然后如果 cnt(0)=cnt(1)\operatorname{cnt}(\texttt{0}) = \operatorname{cnt}(\texttt{1}),任意在 ss 中删掉一个字符就变成了 cnt(0)cnt(1)\operatorname{cnt}(\texttt{0}) \ne \operatorname{cnt}(\texttt{1}) 的情况。

所以,如果 cnt(0)cnt(1)\operatorname{cnt}(\texttt{0}) \ne \operatorname{cnt}(\texttt{1}),答案就是 min(cnt(0),cnt(1))\min(\operatorname{cnt}(\texttt{0}), \operatorname{cnt}(\texttt{1})),否则答案就是 n21\dfrac{n}{2} - 1(如果 cnt(0)=cnt(1)\operatorname{cnt}(\texttt{0}) = \operatorname{cnt}(\texttt{1})nn 必定为偶数)。

代码

#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));
	}
}