https://atcoder.jp/contests/agc049/tasks/agc049_b
这题比A题水一些= =期望太难了
观察发现11可以变成00,01可以变成10
那么1只能够两两消除,或者向左移动了
所以吧S中所有1的位置丢进队列
然后从左到右枚举T,如果当前位是0,然后S中这里又有个1,那么这个1只能被消掉,那么把队列首两个1消除就行了
如果当前是1,那么就从队首拿个1移动到这里
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=5e5+10;
int n,m,cnt,tot,cas;ll ans;
int a[maxl],b[maxl];
bool vis[maxl];
char s[maxl],t[maxl];
queue<int> q;
inline void prework()
{
scanf("%d",&n);
scanf("%s",s+1);
scanf("%s",t+1);
for(int i=1;i<=n;i++)
a[i]=s[i]-'0';
for(int i=1;i<=n;i++)
b[i]=t[i]-'0';
}
inline void mainwork()
{
ans=0;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
cnt1+=a[i],cnt2+=b[i];
/*if(cnt1<cnt2 || (cnt1&1)!=(cnt2&1))
{
ans=-1;
return;
}*/
for(int i=1;i<=n;i++)
if(a[i])
q.push(i);
for(int i=1;i<=n;i++)
if(b[i]==0)
{
if(!q.empty() && q.front()<=i)
{
cnt1-=2;
if(cnt1<cnt2)
{
ans=-1;
return;
}
int x=q.front();q.pop();
int y=q.front();q.pop();
ans+=y-x;
}
}
else
{
int x=q.front();q.pop();
ans+=x-i;
}
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}