Codeforces Round #651 (Div. 2) E. Binary Subsequence Rotation(dp)

题目链接:https://codeforces.com/contest/1370/problem/E

题意

给出两个长为 $n$ 的 $01$ 串 $s$ 和 $t$,每次可以选择 $s$ 的一些下标,使字符只在这些下标内循环右移一个单位,问两个字符串相等至少需要循环移动多少次。

题解

无解的情况

两个字符串中的 $01$ 个数不同。

有解的情况

将 $s$ 中同一位置与 $t$ 不同的字符拿出组成一个新字符串,每次操作一定是取这个新字符串 $01010 \dots$ 或 $10101 \dots$ 的子串,所以找出新字符串中最长的连续为 $0$ 的长度和最长的不被抵消的连续为 $1$ 的长度即可,因为这些都是不能一次连续取的。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; string s, t; cin >> n >> s >> t;
    int zero = 0, mi = 0, mx = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] != t[i]) {
            if (s[i] == '0') zero++; //zero > 0 是最长的连续为 0 的长度
            else zero--; //zero < 0 是最长的不被抵消的连续为 1 的长度
            mi = min(mi, zero);
            mx = max(mx, zero);
        }
    }
    cout << (zero == 0 ? mx - mi : -1);
}

 

posted @ 2020-06-21 13:35  Kanoon  阅读(246)  评论(0编辑  收藏  举报