宣贯,样例3未过,求条
查看原帖
宣贯,样例3未过,求条
421291
Noble_Wolf楼主2024/10/21 21:51
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int re(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
const int N = 2e6+10;
char s[3][N];
int n,m,f[N];
int cal1(){
	memset(f,0,sizeof f);
	int res=0;
	for(int i=1;i<=n;i++){
		if(s[1][i]==s[2][i]){
			if(s[1][i]=='1')f[i]=f[i-1]+2;
			else f[i]=f[i-1]-1;
		}
		else{
			f[i]=f[i-1];
		}
		res=max(res,f[i]);
		if(f[i]<0)f[i]=0;
	}
	return res;
}
int dp[3][N];
int cal2(){
	memset(dp,128,sizeof dp);
	dp[1][0]=dp[2][0]=-2*m;
	int ans=0;
	for(int i=1;i<=n;i++){
		if(s[1][i]==s[2][i]){
			if(s[1][i]=='1'){
				dp[1][i]=max(dp[2][i-1]+2,dp[1][i-1]+1);
				dp[2][i]=max(dp[2][i-1]+1,dp[1][i-1]+2);
			}
			else{
				dp[1][i]=max(dp[1][i-1]-1,dp[2][i-1]-2);
				dp[2][i]=max(dp[2][i-1]-1,dp[1][i-1]-2);
			}
		}
		else{
			for(int j=1;j<=2;j++){
				if(s[j][i]=='1')dp[j][i]=max(dp[j][i-1]+1,dp[3-j][i-1]);
				else dp[j][i]=max(dp[j][i-1]-1,dp[3-j][i-1]);
			}
		}
		dp[1][i]=max(dp[1][i],-2*m);
		dp[2][i]=max(dp[2][i],-2*m);
		ans=max(max(ans,dp[1][i]),dp[2][i]);
	}
	return ans;
}
int main(){
	int QWQ=re(),T=re();
	while(T--){
		n=re(),m=re();
		for(int i=1;i<=2;i++)cin>>s[i]+1;
		cout<<max(cal1(),cal2())<<"\n";
	}
	return 0;
}

2024/10/21 21:51
加载中...