A. Balance the Bits
显然对于一个字符串s
我们每一对0之间必须是()一个合法的括号才行)(也可以 显然是等价的 因为你a拿前者 b就会拿后者
所以这就要求了我们0的个数必须是偶数
然后我们贪心的构造1即可
我们前面全填(后面填)
这样必然是最优的
然后最后再判断一下是否合法
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 1e9+7;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int n;cin>>n;
string s;cin>>s;
if(std::count(s.begin(), s.end(), '0')%2){NO return;}
vector<char>a(n),b(n);
int cnt=0,cnt1=0;
for(int i=0;i<n;i++){
if(s[i]=='0'){
if(cnt1%2){
a[i]='(';cnt1++;
}else{
a[i]=')';cnt++;cnt1++;
}
}
}
for(int i=n-1;i>=0;i--){
if(a[i]==')'||a[i]=='(')continue;
else {
a[i]=')';cnt++;
if(cnt==n/2)break;
}
}
for(int i=0;i<n;i++){
if(a[i]==')'||a[i]=='(')continue;
a[i]='(';
}
int l=0,r=0;
for(int i=0;i<n;i++){
if(a[i]=='(')l++;
else r++;
if(r>l){
NO
return;
}
}
if(l!=r){NO return;}
for(int i=0;i<n;i++){
if(s[i]=='1'){
b[i]=a[i];
}else{
if(a[i]==')')b[i]='(';
else b[i]=')';
}
}
l=0,r=0;
for(int i=0;i<n;i++){
if(b[i]=='(')l++;
else r++;
if(r>l){
NO return;
}
}
if(l!=r){NO return;}
YES
for(auto i:a)cout<<i;cout<<endl;
for(auto i:b)cout<<i;cout<<endl;
}
signed main(){
fast
int t;t=1;cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}
标签:cnt,return,NO,int,Codeforces,712,const,Round
From: https://www.cnblogs.com/ycllz/p/16805927.html