题意:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ab6652e2a319d667c077e8a8e73c5e2f.png)
解法:
只有两种情况:
1. 01->10
2. 11->00
001->010->100,因此情况1可以看作是将1左移.
从左到右遍历,那么当s[i]!=t[i]时,
只能通过修改s[i+1],翻转s[i]来改变s[i],
如果s[i+1]不为1,就需要找到s[i]右边第一个的1,
通过情况1把1传递到s[i+1],
因此这题只需要存一下所有1的位置,
然后从左到右遍历,模拟操作即可.
坑点:要开long long!
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e6+5;
char s[maxm];
char t[maxm];
int n;
signed main(){
cin>>n;
cin>>(s+1);
cin>>(t+1);
vector<int>pos;
for(int i=1;i<=n;i++){
s[i]-='0',t[i]-='0';
if(s[i])pos.push_back(i);
}
int len=pos.size();
int cur=0;
int ans=0;
for(int i=1;i<=n;i++){
while(cur<len&&pos[cur]<=i)cur++;
if(s[i]==t[i])continue;
if(cur>=len){
cout<<-1<<endl;
return 0;
}
ans+=pos[cur]-i;
s[pos[cur]]=0;
cur++;
}
cout<<ans<<endl;
return 0;
}