新奇的思路 然过不了大样例(求调)
查看原帖
新奇的思路 然过不了大样例(求调)
1414326
pszyh楼主2024/12/1 08:56
#include<bits/stdc++.h>
using namespace std;
int t,n,a[2][100010],b[2][100010],ans;
char s1[100010],s2[100010],v1[100010],v2[100010];
int main(){
//	freopen("edit2.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--){
		//输入 
		cin>>n;
		for(int i=1;i<=n;i++) cin>>s1[i];
		for(int i=1;i<=n;i++) cin>>s2[i];
		for(int i=1;i<=n;i++) cin>>v1[i];
		for(int i=1;i<=n;i++) cin>>v2[i];
		
		//计算到i位有多少能用的0,1; 
		for(int i=1;i<=n;i++){
			a[s1[i]-'0'][i]=1;
			a[(s1[i]-'0'+1)%2][i]=0;//为省掉初始化 
			if(v1[i]=='1'&&v1[i-1]=='1'){
				a[0][i]+=a[0][i-1];
				a[1][i]+=a[1][i-1];
			}
		}
		for(int i=1;i<=n;i++){
			b[s2[i]-'0'][i]=1;
			b[(s2[i]-'0'+1)%2][i]=0;
			if(v2[i]=='1'&&v2[i-1]=='1'){
				b[0][i]+=b[0][i-1];
				b[1][i]+=b[1][i-1];
			}
		}
		
		//计算有多少匹配的0,1; 
		int l=1,r=1;
		while(l<=n&&r<=n){
			if(v1[l]=='1') while(v1[l+1]!='0'&&l+1<=n) l++;
			if(v2[r]=='1') while(v2[r+1]!='0'&&r+1<=n) r++;
			int y=min(a[0][l],b[0][r]);
			int y1=min(a[1][l],b[1][r]);
			ans+=(y+y1);
			if(l<r){ 
				b[0][r]-=y;//减去已经算过的 
				b[1][r]-=y1;
				l++;
			}else if(l>r){
				a[0][l]-=y;
				a[1][l]-=y1;
				r++;
			}else{
				l++;//两个都到下一位就不用减了 
				r++;
			}
		}
		cout<<ans<<'\n';
		ans=0;
	}
}
2024/12/1 08:56
加载中...