P11361 [NOIP2024] 编辑字符串(民间数据) 我使用set+二分维护,O(nlogn),挂成60分,跟 O(n2) 一样分数,求问原因。
是常数太大的原因吗?
正确性应该没有问题。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int T,p=0;
int n,ans;
char s1[N],s2[N],t1[N],t2[N];
set<int> pos_s1,pos_s2,pos_s3,pos_s4,pos_t1,pos_t2;
int main()
{
// ios::sync_with_stdio(0);
//cin.tie(0);
// cout.tie(0);
// freopen("edit2.in","r",stdin);
//freopen("2.out","w",stdout);
cin>>T;
while(T--) {
pos_s1.clear();
pos_s2.clear();
pos_s3.clear();
pos_s4.clear();
pos_t1.clear();
pos_t2.clear();
ans=0;
cin>>n;
cin>>s1+1>>s2+1>>t1+1>>t2+1;
for(int i=1; i<=n; i++) {
if(s1[i]=='0') pos_s1.insert(i);
if(s1[i]=='1') pos_s2.insert(i);
if(s2[i]=='0') pos_s3.insert(i);
if(s2[i]=='1') pos_s4.insert(i);
if(t1[i]=='0') pos_t1.insert(i);
if(t2[i]=='0') pos_t2.insert(i);
}
pos_s1.insert(n+1);
pos_s2.insert(n+1);
pos_s3.insert(n+1);
pos_s4.insert(n+1);
pos_t1.insert(n+1);
pos_t2.insert(n+1);
for(int i=1; i<=n; i++) {
//cout<<s1+1<<endl;
//cout<<s2+1<<endl;
//cout<<endl;
if(s1[i]==s2[i]) continue;
else if(s1[i]!=s2[i]) {
if(t1[i]=='1') {
int r1=*pos_s1.upper_bound(i);
int r2=*pos_s2.upper_bound(i);
int c1=*upper_bound(pos_t1.begin(),pos_t1.end(),i);
if(c1==n+1) {
if(s1[i]=='1') {
if(r1<=n) {
swap(s1[i],s1[r1]);
pos_s2.insert(r1);//标记1的数组加入r1
pos_s1.erase(r1);//标记0的数组减掉r1
pos_s1.insert(i);
pos_s2.erase(i);
//pos_s1.erase(r1);
}
} else if(s1[i]=='0') {
if(r2<=n) {
swap(s1[i],s1[r2]);
pos_s2.erase(r2);
pos_s1.insert(r2);//标记0的数组加入r1
pos_s1.erase(i);
pos_s2.insert(i);
}
}
} else {
if(s1[i]=='1') {
if(r1<=n&&r1<c1) {
swap(s1[i],s1[r1]);
pos_s2.insert(r1);
pos_s1.erase(r1);
pos_s1.insert(i);
pos_s2.erase(i);
}
} else if(s1[i]=='0') {
if(r2<=n&&r2<c1) {
swap(s1[i],s1[r2]);
pos_s1.insert(r2);
pos_s2.erase(r2);
pos_s2.insert(i);
pos_s1.erase(i);
}
}
}
}
if(s1[i]==s2[i]) continue;
if(t2[i]=='1') {
int r1=*upper_bound(pos_s3.begin(),pos_s3.end(),i);
int r2=*upper_bound(pos_s4.begin(),pos_s4.end(),i);
int c1=*upper_bound(pos_t2.begin(),pos_t2.end(),i);
if(c1==n+1) {
if(s2[i]=='1') {
if(r1<=n) {
swap(s2[i],s2[r1]);
pos_s4.insert(r1);//标记1的数组加入r1
pos_s3.erase(r1);//标记0的数组减掉r1
pos_s3.insert(i);
pos_s4.erase(i);
}
} else if(s2[i]=='0') {
if(r2<=n) {
swap(s2[i],s2[r2]);
pos_s4.erase(r2);
pos_s3.insert(r2);//标记0的数组加入r1
pos_s3.erase(i);
pos_s4.insert(i);
}
}
}
else{
if(s2[i]=='1') {
if(r1<=n&&r1<c1) {
swap(s2[i],s2[r1]);
pos_s4.insert(r1);
pos_s3.erase(r1);
pos_s3.insert(i);
pos_s4.erase(i);
}
} else if(s2[i]=='0') {
if(r2<=n&&r2<c1) {
swap(s2[i],s2[r2]);
pos_s3.insert(r2);
pos_s4.erase(r2);
pos_s4.insert(i);
pos_s3.erase(i);
}
}
}
}
}
}
for(int i=1; i<=n; i++) {
if(s1[i]==s2[i]) ans++;
}
cout<<ans<<endl;
}
//cout<<s1+1<<endl;
//cout<<s2+1<<endl;
return 0;
}