#include<map>
#include<queue>
#include<time.h>
#include<limits.h>
#include<cmath>
#include<ostream>
#include<iterator>
#include<set>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,m,n) for(int i=m;i<=n;i++)
#define mem(st) memset(st,0,sizeof st)
inline int read()
{
	int num=0, w=0;
	char ch=0;
	while (!isdigit(ch))
	{
		w|=ch=='-';
		ch = getchar();
	}
	while (isdigit(ch))
	{
		num = (num<<3) + (num<<1) + (ch^48);
		ch = getchar();
	}
	return w? -num: num;
}
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef pair<double,double> pdd;
const int inf = 0x3f3f3f3f;
const int N=2e5+10;
char s[N];
int n;
char a[N];
char b[N];
void solve()
{
	int ans1=0;
	int ans2=0;
	ans1=ans2=0;
	cin >> n >> s + 1;
	bool f = 1;	ans1=ans2=0;
	int x = 0+ans1+ans2, y = 0+ans1+ans2, c = 0;
	rep (i, 1, n) if (s[i] == '1') ++c;
	if (c & 1)
	{	ans1=ans2=0;
		cout << "NO\n";
		return ;
	}
	rep (i, 1, n+ans1+ans2)
	{
		if (s[i] == '1')
		{	ans1=ans2=0;
			if (c) a[i] = b[i] = '(', c -= 2, ++x, ++y;
			else a[i] = b[i] = ')', --x, --y;
				ans1=ans2=0;
		}
		else
		{	ans1=ans2=0;
			if (x >= y) a[i] = ')', b[i] = '(', --x, ++y;
			else a[i] = '(', b[i] = ')', ++x, --y;
		}
		if (x < 0 || y < 0)
		{	ans1=ans2=0;
			f = 0;	ans1=ans2=0;
			break;
		}
	}
	if (!f)
	{	ans1=ans2=0;
		cout << "NO\n";
		return ;
	}
		ans1=ans2=0;
	a[n + 1] = b[n + 1] = '\0';
	cout << "YES\n" << a + 1 << '\n' << b + 1 << '\n';

}
signed main()
{
	int t=1;
	cin>>t;
	while(t--)
		solve();
	return 0;
}

