机房同学使用以下代码在linux系统和Windows系统上都可以正常跑完测试样例,没有RE(尽管可能会WA),但是在洛谷上评测时就有一车的RE,究竟是为什么,死亡回放
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int T;
int n;
pair<int,int> p1[N],p2[N];
int n1[N][3],n2[N][3];
int max_1,max_2;
signed main(){
freopen("edit.in","r",stdin);
freopen("edit.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
int ans=0;
max_1=max_2=0;
string s1,s2,t1,t2;
cin>>n>>s1>>s2>>t1>>t2;
bool ok=1;
for(int i=1;i<n;++i){
if(s1[i]!=s1[i-1]){
ok=0;
break;
}
}
if(ok){
for(int i=0;i<n;++i){
t1[i]='0';
}
}
pair<int,int>dq={0,0};
int zzn=0,oon=0;
bool ui=0;
t1[n]=t2[n]='0';
for(int i=0;i<=n;++i){
if(t1[i]=='1'){
if(ui){
dq.second=i;
}else{
dq.first=i;
dq.second=i;
ui=true;
}
if(s1[i]=='1'){
++oon;
}else{
++zzn;
}
}else{
if(dq.second!=dq.first){
p1[max_1]=dq;
n1[max_1][0]=zzn;
n1[max_1][1]=oon;
++max_1;
}
zzn=oon=ui=dq.first=dq.second=0;
}
}
for(int i=0;i<=n;++i){
if(t2[i]=='1'){
if(ui){
dq.second=i;
}else{
dq.first=i;
dq.second=i;
ui=true;
}
if(s2[i]=='1'){
++oon;
}else{
++zzn;
}
}else{
if(dq.second!=dq.first){
p2[max_2]=dq;
n2[max_2][0]=zzn;
n2[max_2][1]=oon;
++max_2;
}
zzn=oon=ui=dq.first=dq.second=0;
}
}
int fff=0;
for(int j=0;j<p1[0].first;++j){
if(j>p2[fff].second){
for(;j>p2[fff].second;++fff);
}
if(p2[fff].first<=j&&j<=p2[fff].second){
if(n2[fff][s1[j]-'0']){
--n2[fff][s1[j]-'0'];
++ans;
}
}else{
if(s1[j]==s2[j]){
++ans;
}
}
}
for(int i=1;i<max_1;++i){
for(int j=p1[i-1].second+1;j<p1[i].first;++j){
if(j>p2[fff].second){
for(;j>p2[fff].second;++fff);
}
if(p2[fff].first<=j&&j<=p2[fff].second){
if(n2[fff][s1[j]-'0']){
--n2[fff][s1[j]-'0'];
++ans;
}
}else{
if(s1[j]==s2[j]){
++ans;
}
}
}
}
for(int j=p1[max_1-1].second+1;j<n;++j){
if(j>p2[fff].second){
for(;j>p2[fff].second;++fff);
}
if(p2[fff].first<=j&&j<=p2[fff].second){
if(n2[fff][s1[j]-'0']){
--n2[fff][s1[j]-'0'];
++ans;
}
}else{
if(s1[j]==s2[j]){
++ans;
}
}
}
fff=0;
for(int j=0;j<p2[0].first;++j){
if(j>p1[fff].second){
for(;j>p1[fff].second;++fff);
}
if(p1[fff].first<=j&&j<=p1[fff].second){
if(n1[fff][s2[j]-'0']){
--n1[fff][s2[j]-'0'];
++ans;
}
}
}
for(int i=1;i<max_2;++i){
for(int j=p2[i-1].second+1;j<p2[i].first;++j){
if(j>p1[fff].second){
for(;j>p1[fff].second;++fff);
}
if(p1[fff].first<=j&&j<=p1[fff].second){
if(n1[fff][s2[j]-'0']){
--n1[fff][s2[j]-'0'];
++ans;
}
}
}
}
for(int j=p2[max_2-1].second+1;j<n;++j){
if(j>p1[fff].second){
for(;j>p1[fff].second;++fff);
}
if(p1[fff].first<=j&&j<=p1[fff].second){
if(n1[fff][s2[j]-'0']){
--n1[fff][s2[j]-'0'];
++ans;
}
}
}
for(int i=0,j=0;i<max_1&&j<max_2;){
pair<int,int>jiao={max(p1[i].first,p2[j].first),min(p1[i].second,p2[j].second)};
while(jiao.second<jiao.first){
if(p1[i].second<p2[j].first){
++i;
}else{
++j;
}
jiao=make_pair(max(p1[i].first,p2[j].first),min(p1[i].second,p2[j].second));
}
int mx=jiao.second-jiao.first+1;
int djl=min(n2[j][0],min(n1[i][0],mx));
ans+=djl;
n2[j][0]-=djl;
n1[i][0]-=djl;
mx-=djl;
djl=min(n2[j][1],min(n1[i][1],mx));
ans+=djl;
n2[j][1]-=djl;
n1[i][1]-=djl;
if(p1[i].second<p2[j].first){
++i;
}else if(p1[i].second>p2[j].first){
++j;
}else{
++i,++j;
}
}
cout<<ans<<'\n';
}
cout.flush();
return 0;
}