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

 

posted @ 2020-06-01 10:30  Kanoon  阅读(243)  评论(0编辑  收藏  举报