题目链接: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); }