#include <bits/stdc++.h>

//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_poizcy.hpp>
#define pb                push_back
#define mp                make_pair
#define all(a)            (a).begin(), (a).end()
#define mem(a,h)          memset(a, (h), sizeof(a))
#define mul(a,b) (((a%MOD) * (b%MOD))%MOD)
#define forg(i, b, e, c)    for (ll i = (ll)b; i < (ll)e; i+=c)
#define forr(i, b, e)    for (ll i = b; i < e; i++)


using namespace std;
//using namespace __gnu_pbds;

typedef long long  ll;
typedef pair<ll,ll>  ii;
typedef pair<ll, ii>  iii;
//typedef tree<ii,null_type,less<ii>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#define initseg ll new_nodo=(pnodo*2),mid=(iz+der)/2;
#define fi first
#define se second
#define ptr item*


const long long INF = 1e18;
const ll tam =310000;
const ll MOD=998244353;
const ll cmplog=20;
void solve()
{
    int n;
    cin>>n;
    string txt;
    cin>>txt;
    int c1,c2;
    c1=c2=0;
    forr(i,0,n)
    {
        if (txt[i]=='1')

            c1++;
        else
            c2++;
    }
    if (c1%2==0 && c2%2==0 && txt[0]=='1' && txt.back()=='1')
    {
        cout<<"YES"<<endl;
        string ans1(n,')'),ans2(n,')');
        ans1[0]=ans2[0]='(';
        c2=c1=1;
        forr(i,1,n-1)
        {
            if (txt[i]=='0')
            {
                ans2[i]=')',ans1[i]='(';
                if (c2)swap(ans1[i],ans2[i]);
                c2^=1;
            }
            else
            {
                if (c1)
                    ans1[i]=ans2[i]='(';
                else
                    ans1[i]=ans2[i]=')';
                    c1^=1;
            }
        }
        cout<<ans1<<endl;
        cout<<ans2<<endl;
    }
    else
        cout<<"NO"<<endl;
}
int main()
{
    ios::sync_with_stdio(false) ;cin.tie(0);
    int casos;
    cin>>casos;
    while(casos--)
    {
        solve();
    }
}
