【Codeforces1503A】Balance the Bits(构造)

题目大意:

构造两个合法括号串满足指定的位置字符相同且其它位置字符不同。


首先,如果指定位置(相同或不同)数量为奇数,必定无法构造出满足题意的字符串。

另外,如果有指定位置(不同)位于首位或末位,必有一个字符串在此位置的括号无法被匹配,所以在这种情况下无法构造出满足题意的字符串。

根据题目的性质,我们可以发现,括号字符未被匹配可以分为以下两种情况:

  1. 右括号的左边没有左括号。

  2. 左括号的右边没有右括号。

为了避免括号未被匹配的情况,我们将指定位置(相同)的前一半安排左括号,右一半安排右括号。

至于指定位置(不同),左括号、右括号交替安排。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
char s[200000+10];
char a[200000+10],b[200000+10];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T;
	cin >> T;
	while(T--){
		cin >> n >> (s+1);
		ll cnt=0;
		for(ll i=1;i<=n;i++){
			if(s[i]=='1'){
				cnt++;
			}
		}
		if(s[1]=='0'||s[n]=='0'||cnt%2){
			cout << "NO" << endl;
		}else{
			ll cnt0=0,cnt1=0;
			for(ll i=1;i<=n;i++){
				if(s[i]=='1'){
					cnt1++;
					a[i]=b[i]=(cnt1<=cnt/2?'(':')');
				}else if(s[i]=='0'){
					cnt0++;
					a[i]=(cnt0%2?'(':')');
					b[i]=(cnt0%2?')':'(');
				}
			}
			cout << "YES" << endl;
			for(ll i=1;i<=n;i++)cout << a[i];
			cout << endl;
			for(ll i=1;i<=n;i++)cout << b[i];
			cout << endl;
		}
	}
	return 0;
}
posted @ 2023-09-01 11:35  Alric  阅读(5)  评论(0编辑  收藏  举报