zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    Docker底层技术了解(3)
    Docker整体结构了解(2)
    Docker简介(1)
    linux常用命令
    python反射
    flask线程隔离技术
    flask核心机制
    并发编程
    socket通信
    网络编程
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13172216.html
Copyright © 2011-2022 走看看