Problem - B - Codeforces
找到最小操作次数,使得子串对应位与原来字符串对应位不相同。
交换是没有代价的,但是删除有代价。
首先复制两个一模一样的串,我们把下面作为固定串,然后对串中0和1的个数进行计数,由于我们最终的子串是向左对齐并依次与原串相反的,所以我们不妨从固定串的右边删起。先看下图
也就是说我们只需要删到固定串的0小于等于原串1的个数且固定串的1的个数小于原串0的个数,此时固定串的长度就是我们要找的长度,再用原串长度减去固定串的长度即可。
下面是代码
using i64 = long long;
void solve() {
std::string s;
std::cin >> s;
std::array<int, 2> cnt{};
for (auto x : s) {
cnt[x - '0'] += 1;
}
int n = s.size();
int ans = n;
auto cur = cnt;
for (int i = n - 1; i >= 0; i--) {
if (cur[0] <= cnt[1] && cur[1] <= cnt[0]) {
ans = n - 1 - i;
break;
}
cur[s[i] - '0'] -= 1;
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}