Codeforces Round #646 (Div. 2) B. Subsequence Hate(前缀和)
题目链接:https://codeforces.com/contest/1363/problem/B
题意
可以将 $01$ 串中的 $0$ 变为 $1$、$1$ 变为 $0$,问至少需要变换多少字符使得 $01$ 串中不含有 $010$ 或 $101$ 的子序列。
题解
不含有 $010$ 或 $101$ 的子序列即任意两个 $0$ 间没有 $1$、两个 $1$ 间没有 $0$ 。
这样的 $01$ 串有两种情况:
- 连续的 $0$ $+$ 连续的 $1$
- 连续的 $1$ $+$ 连续的 $0$
计算将前 $i$ 位都变为 $0$ 或 $1$ 需要变换的字符,然后分别枚举两种情况中 $01$ 的长度即可。
代码
#include <bits/stdc++.h> using namespace std; void solve() { string s; cin >> s; int n = s.size(); int pre[2][n + 1]; memset(pre, 0, sizeof pre); for (int i = 0; i < n; i++) { pre[0][i + 1] = pre[0][i] + (s[i] == '1'); pre[1][i + 1] = pre[1][i] + (s[i] == '0'); } int ans = n; for (int i = 0; i <= n; i++)//枚举 i个0 + n-i个1 ans = min(ans, pre[0][i] + pre[1][n] - pre[1][i]); for (int i = 0; i <= n; i++)//枚举 i个1 + n-i个0 ans = min(ans, pre[1][i] + pre[0][n] - pre[0][i]); cout << ans << "\n"; } int main() { int t; cin >> t; while (t--) solve(); }