【Codeforces1503A】Balance the Bits(构造)
题目大意:
构造两个合法括号串满足指定的位置字符相同且其它位置字符不同。
首先,如果指定位置(相同或不同)数量为奇数,必定无法构造出满足题意的字符串。
另外,如果有指定位置(不同)位于首位或末位,必有一个字符串在此位置的括号无法被匹配,所以在这种情况下无法构造出满足题意的字符串。
根据题目的性质,我们可以发现,括号字符未被匹配可以分为以下两种情况:
-
右括号的左边没有左括号。
-
左括号的右边没有右括号。
为了避免括号未被匹配的情况,我们将指定位置(相同)的前一半安排左括号,右一半安排右括号。
至于指定位置(不同),左括号、右括号交替安排。
#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;
}