https://codeforces.com/contest/1503/problem/A
经典不会做1600的构造
这种题要由已知信息推测。已知n是偶数,()括号数量一定要严格等于n/2,si=1的ai=bi,此时是不影响a,b中左右括号的数量差的
si=0时,ai!=bi,此时在这一位上会影响括号的数量差,所以我们必须要让si=0的数量为偶数,才能让a,b中左右括号数量都等于n/2
可以预见最后的结果就是左边的si=1 ai=bi=( ,右边的si=1, ai=bi=) ,此时我们可以推想出我们中间所有si=0如果不想让某时刻右括号多于左括号,我们让他交替着放是最优的,因为其他位置上a,b都是一样的
设x=cnt(si=0)/2,那么就是左边n/2-x个si=1放左括号,右边的放右括号,si=0的交替放,看a,b是否合法就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,k,cnt,tot,cas,ans;
int a[maxl],b[maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%d",&n);
scanf("%s",s+1);
}
inline void mainwork()
{
ans=0;cnt=0;
for(int i=1;i<=n;i++)
if(s[i]=='0')
cnt++;
if(cnt&1)
return;
ans=1;
int x=cnt/2,cnt1=0;cnt=0;
for(int i=1;i<=n;i++)
if(s[i]=='0')
{
cnt++;
if(cnt&1) a[i]=1,b[i]=-1;
else a[i]=-1,b[i]=1;
}
else
{
cnt1++;
if(cnt1<=n/2-x)
a[i]=b[i]=1;
else
a[i]=b[i]=-1;
}
int suma=0,sumb=0;
for(int i=1;i<=n;i++)
{
suma+=a[i];sumb+=b[i];
if(suma<0 || sumb<0)
ans=0;
}
}
inline void print()
{
if(!ans)
puts("NO");
else
{
puts("YES");
for(int i=1;i<=n;i++)
putchar(a[i]==1?'(':')');
puts("");
for(int i=1;i<=n;i++)
putchar(b[i]==1?'(':')');
puts("");
}
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}