http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=892&pid=1002
第2种操作肯定只会操作1次,而且在i位置操作必须让前i位都变成1后再全变0向后进1位,才可能比直接换更优。
你让S的一堆0变成1以后,再把他们全变0,如果之后要再进行一次操作的话,又要把他们全变1,肯定不优,那么最多操作一次
那么我们枚举每一个i,算出前i位变为1的答案,跟总答案比较一下就行了,肯定中间有很多不太好的答案,但是扫过去总能找到最佳答案。
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxl=1e5+10;
int n,m,cas,k,cnt,tot,ans;
int f[maxl],dp[maxl];
int sums[maxl],sumt[maxl];
char s[maxl],t[maxl];
bool in[maxl];
inline void prework()
{
scanf("%d",&n);
scanf("%s",s+1);scanf("%s",t+1);
int tmp;ans=0;s[n+1]='0';t[n+1]='0';
for(int i=1;i<=n+1;i++)
{
sums[i]=sums[i-1];sumt[i]=sumt[i-1];
if(s[i]=='1')
sums[i]++;
if(t[i]=='1')
sumt[i]++;
if(s[i]!=t[i])
ans++;
f[i]=ans;
}
}
inline void mainwork()
{
int tmp;
for(int i=1;i<=n;i++)
{
tmp=i-sums[i]+sumt[i]+1;
if(s[i+1]=='1')
tmp++;
if(t[i+1]=='0')
tmp++;
tmp+=f[n+1]-f[i+1];
ans=min(ans,tmp);
}
}
inline void print()
{
printf("%d\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}