rt,按照思路写完只有40pts,过了大样例,洛谷只过了 #5~#12,求给各位大佬给个hack。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,tot,tot2;
bool s[N],s2[N],t[N],t2[N];
struct uuu{
int l,r,cntw,cntb;
}a[N],b[N];
void readd()
{
cin>>n;
for(int i=1;i<=n;i++)
{
char ch;
cin>>ch;
s[i]=ch-'0';
}
for(int i=1;i<=n;i++)
{
char ch;
cin>>ch;
s2[i]=ch-'0';
}
for(int i=1;i<=n;i++)
{
char ch;
cin>>ch;
t[i]=ch-'0';
}
for(int i=1;i<=n;i++)
{
char ch;
cin>>ch;
t2[i]=ch-'0';
}
}
bool b1=0;
void solvea()
{
int cnt=0;
for(int i=1;i<=n;i++)
{
if(s[i]==s2[i]) cnt++;
}
cout<<cnt<<"\n";
}
void solveb()
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(t[i]==1)
{
int cntw=0,cntb=0,cntw2=0,cntb2=0;
while(i<=n && t[i]==1)
{
if(s[i]==1) cntb++;
if(s[i]==0) cntw++;
if(s2[i]==1) cntb2++;
if(s2[i]==0) cntw2++;
i++;
}
i--;
ans+=min(cntb,cntb2)+min(cntw,cntw2);
}else if(s[i]==s2[i]) ans++;
}
cout<<ans<<"\n";
}
void teshuxingzhi()
{
bool fla=1;
for(int i=1;i<=n-1;i++)
{
if(s[i]!=s[i+1])
{
fla=0;
break;
}
}
if(fla)
{
b1=1;
solvea();
return ;
}
bool flb=1;
for(int i=1;i<=n;i++)
{
if(t[i]!=t2[i])
{
flb=0;
break;
}
}
if(flb)
{
b1=1;
solveb();
return ;
}
}
void init()
{
b1=0;
tot=tot2=0;
}
int jiao(int l,int r,int ll,int rr)
{
int L=max(l,ll),R=min(r,rr);
return R-L+1;
}
void solve()
{
readd();
init();
teshuxingzhi();
if(b1) return ;
for(int i=1;i<=n;i++)
{
if(t[i]==1)
{
a[++tot].l=i;
a[tot].cntb=a[tot].cntw=0;
while(i<=n && t[i]==1)
{
if(s[i]==1) a[tot].cntb++;
if(s[i]==0) a[tot].cntw++;
i++;
}
i--;
a[tot].r=i;
}else
{
a[++tot].l=a[tot].r=i;
a[tot].cntb=a[tot].cntw=0;
if(s[i]==1) a[tot].cntb=1;
if(s[i]==0) a[tot].cntw=1;
}
}
for(int i=1;i<=n;i++)
{
if(t2[i]==1)
{
b[++tot2].l=i;
b[tot2].cntb=b[tot2].cntw=0;
while(i<=n && t2[i]==1)
{
if(s2[i]==1) b[tot2].cntb++;
if(s2[i]==0) b[tot2].cntw++;
i++;
}
i--;
b[tot2].r=i;
}else
{
b[++tot2].l=b[tot2].r=i;
b[tot2].cntb=b[tot2].cntw=0;
if(s2[i]==1) b[tot2].cntb=1;
if(s2[i]==0) b[tot2].cntw=1;
}
}
int ans=0;
for(int i=1,j=1;i<=tot,j<=tot2;)
{
int ra=a[i].r,rb=b[j].r;
int mb=min(a[i].cntb,b[j].cntb),mw=min(a[i].cntw,b[j].cntw);
int p=jiao(a[i].l,a[i].r,b[j].l,b[j].r);
if(mw+mb<p)
{
ans+=mb+mw;
a[i].cntb-=mb,a[i].cntw-=mw;
b[j].cntb-=mb,b[j].cntw-=mw;
}else
{
if(mb>p)
{
ans+=p;
a[i].cntb-=p,b[j].cntb-=p;
}else
{
ans+=mb;
p-=mb;
a[i].cntb-=mb,b[j].cntb-=mb;
if(mw>p)
{
ans+=p;
a[i].cntw-=p,b[j].cntw-=p;
}else
{
ans+=mw;
a[i].cntw-=mw,b[j].cntw-=mw;
}
}
}
if(ra>rb) j++;
else if(ra<rb) i++;
else i++,j++;
}
cout<<ans<<"\n";
}
signed main()
{
// freopen("edit2.in","r",stdin);
// freopen("edit.out","w",stdout);
int _;
cin>>_;
while(_--)
{
solve();
}
}