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);
    }
  • 相关阅读:
    我要把铁路修到威斯特摩兰
    1新建空白jasperreport模板
    oracle权限
    swagger配置
    lombok插件基本使用
    oracle与sqlserver的区别
    yaml语法学习
    第一个SpringBoot
    spring多环境切换
    JSR303数据校验
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13172216.html
Copyright © 2011-2022 走看看