数据过水,n方有90分
查看原帖
数据过水,n方有90分
935976
Amoribus楼主2024/12/1 12:44

https://www.luogu.com.cn/record/192234306

#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];
int pos_s1[N],pos_s2[N],pos_s3[N],pos_s4[N],pos_t1[N],pos_t2[N];
int cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//freopen("edit2.in","r",stdin);
	cin>>T;
	while(T--){
		cnt1=cnt2=cnt3=cnt4=cnt5=cnt6=0;
		memset(pos_s1,0,sizeof(pos_s1));
		memset(pos_s2,0,sizeof(pos_s2));
		memset(pos_s3,0,sizeof(pos_s3));
		memset(pos_s4,0,sizeof(pos_s4));
		memset(pos_t1,0,sizeof(pos_t1));
		memset(pos_t2,0,sizeof(pos_t2));
		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[++cnt1]=i;
			if(s1[i]=='1') pos_s2[++cnt2]=i;
			if(s2[i]=='0') pos_s3[++cnt3]=i;
			if(s2[i]=='1') pos_s4[++cnt4]=i;
			if(t1[i]=='0') pos_t1[++cnt5]=i;
			if(t2[i]=='0') pos_t2[++cnt6]=i;
		}
		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]=='0'&&t2[i]=='0') continue;
				if(t1[i]=='1'){
					/*int k1=upper_bound(pos_s1+1,pos_s1+cnt1+1,i)-pos_s1;
					int k2=upper_bound(pos_s2+1,pos_s2+cnt2+1,i)-pos_s2;
					int r1=pos_s1[k1];
					int r2=pos_s2[k2];
					int c1=upper_bound(pos_t1+1,pos_t1+cnt5+1,i)-pos_t1;
					if(c1==cnt5+1){
						if(k1<=cnt1&&s1[i]=='1') swap(s1[i],s1[r1]);
					 	else if(k2<=cnt2&&s1[i]=='0') swap(s1[i],s1[r2]);
					}
					else{
						c1=pos_t1[c1];
						if(k1<=cnt1&&s1[i]=='1'&&r1<=n&&r1<c1) swap(s1[i],s1[r1]);
						else if(k2<=cnt2&&s1[i]=='0'&&r2<=n&&r2<c1) swap(s1[i],s1[r2]);						
					}*/

					for(int j=i+1;j<=n;j++){
						if(t1[j]=='0') break;
						if(s1[j]==s2[i]){
							swap(s1[j],s1[i]);
							break;
						}
					}
				}
				if(s1[i]==s2[i]) continue;
				if(t2[i]=='1'){
					/*int k1=upper_bound(pos_s3+1,pos_s3+cnt3+1,i)-pos_s3;
					int k2=upper_bound(pos_s4+1,pos_s4+cnt4+1,i)-pos_s4;
					k1=pos_s3[k1];
					k2=pos_s4[k2];
					int c1=upper_bound(pos_t2+1,pos_t2+cnt6+1,i)-pos_t2;
					if(c1>cnt6){
						if(k1!=0&&s2[i]=='1'&&k1<=n) swap(s2[i],s2[k1]);
					 	else if(k2!=0&&s2[i]=='0'&&k2<=n) swap(s2[i],s2[k2]);
					}
					else{
						c1=pos_t2[c1];
						if(k1!=0&&s2[i]=='1'&&k1<=n&&k1<c1) swap(s2[i],s2[k1]);
						else if(k2!=0&&s2[i]=='0'&&k2<=n&&k2<c1) swap(s2[i],s2[k2]);						
					}*/
					
					for(int j=i+1;j<=n;j++){
						if(t2[j]=='0') break;
						if(s2[j]==s1[i]){
							swap(s2[j],s2[i]);
							break;
						}
					}
				}
			}
			
		}
		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;
}
2024/12/1 12:44
加载中...