0
点赞
收藏
分享

微信扫一扫

D. Mark and Lightbulbs(贪心)


D. Mark and Lightbulbs(贪心)

把连续相同的序列即为一块。

显然块的个数和块的相对顺序不能改变。

因为 中间的

接下来考虑对于

如何变成

我们针对右部分的0操作,显然可以操作次。1同理。

因为对称性,类型同理。

可以发现修改的次数就是后部分的起始位置。

因此对于多个类型按顺序贪心,不断缩小问题规模分治。

#include <bits/stdc++.h>

using namespace std;

const int N = 200010;
char s[N], t[N];
int n;
void solve(){
scanf("%d",&n);
scanf("%s", s + 1);
scanf("%s", t + 1);
vector<int>a, b;
for(int i = 1; i <= n; i ++ ){
if(s[i] != s[i - 1]) a.push_back(i);
if(t[i] != t[i - 1]) b.push_back(i);
}
if(s[1] != t[1] || s[n] != t[n] || a.size() != b.size()) puts("-1");
else{
long long ans = 0;
int len = a.size();
for(int i = 0; i < len; i ++ ) ans += abs(a[i] - b[i]);
printf("%lld\n", ans);
}
}
int main(){
int tt;
scanf("%d",&tt);
while(tt -- ){
solve();
}
return 0;
}


举报

相关推荐

0 条评论