AT_agc049_b [AGC049B] Flip Digits 题解
JAMES__KING · · 题解
在打模拟赛的时候碰到了这道题,现在来回忆一下自己与众不同的思路。
首先,考虑到要让两个长度相同的串变得相同,我们可以按长度逐位循环枚举,而枚举到每一位则会有两种情况:
注意:
-
不开 long long 见祖宗。
-
需要一个值来记录上一个
1 出现位置的下标,下一次枚举时只要从后一位开始就行了。
下面贴出代码:
#include<bits/stdc++.h>
using namespace std;
int n,s,ss;
long long ans;
char s1[500005],s2[500005];
signed main()
{
cin>>n;
cin>>s1>>s2;
for(int i=0;i<n;i++)
{
if(s1[i]==s2[i]) continue;
s=0;
for(int j=max(i+1,ss);j<n;j++)//寻找
if(s1[j]=='1')
{
s=j;
break;
}
ss=s+1;
if(s==0)
{
cout<<-1;
return 0;
}
ans+=s-i;
s1[s]='0';
s1[i]=s2[i];//改变
}
cout<<ans;
return 0;
}