/* in the name of Anton */ /* Compete against Yourself. Author - Aryan (@aryanc403) Atcoder library - https://atcoder.github.io/ac-library/production/document_en/ */ #ifdef ARYANC403 #include <header.h> #else #pragma GCC optimize ("Ofast") #pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx") //#pragma GCC optimize ("-ffloat-store") #include<bits/stdc++.h> #define dbg(args...) 42; #endif // y_combinator from @neal template https://codeforces.com/contest/1553/submission/123849801 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0200r0.html template<class Fun> class y_combinator_result { Fun fun_; public: template<class T> explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) {} template<class ...Args> decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward<Args>(args)...); } }; template<class Fun> decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun)); } using namespace std; #define fo(i,n) for(i=0;i<(n);++i) #define repA(i,j,n) for(i=(j);i<=(n);++i) #define repD(i,j,n) for(i=(j);i>=(n);--i) #define rep(n) for(int i = 0;i<n;i++) #define all(x) begin(x), end(x) #define sz(x) ((lli)(x).size()) #define pb push_back #define mp make_pair #define X first #define Y second #define endl "\n" typedef long long int lli; typedef long double mytype; typedef pair<lli,lli> ii; typedef vector<ii> vii; typedef vector<lli> vi; const auto start_time = std::chrono::high_resolution_clock::now(); void aryanc403() { #ifdef ARYANC403 auto end_time = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> diff = end_time-start_time; cerr<<"Time Taken : "<<diff.count()<<"\n"; #endif } long long readInt(long long l, long long r, char endd) { long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true) { char g=getchar(); if(g=='-') { assert(fi==-1); is_neg=true; continue; } if('0'<=g&&g<='9') { x*=10; x+=g-'0'; if(cnt==0) { fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd) { if(is_neg) { x=-x; } assert(l<=x&&x<=r); return x; } else { assert(false); } } } string readString(int l, int r, char endd) { string ret=""; int cnt=0; while(true) { char g=getchar(); assert(g!=-1); if(g==endd) { break; } cnt++; ret+=g; } assert(l<=cnt&&cnt<=r); return ret; } long long readIntSp(long long l, long long r) { return readInt(l,r,' '); } long long readIntLn(long long l, long long r) { return readInt(l,r,'\n'); } string readStringLn(int l, int r) { return readString(l,r,'\n'); } string readStringSp(int l, int r) { return readString(l,r,' '); } void readEOF(){ assert(getchar()==EOF); } vi readVectorInt(int n,lli l,lli r){ vi a(n); for(int i=0;i<n-1;++i) a[i]=readIntSp(l,r); a[n-1]=readIntLn(l,r); return a; } bool isBinaryString(const string s){ for(auto x:s){ if('0'<=x&&x<='1') continue; return false; } return true; } // #include<atcoder/dsu> // vector<vi> readTree(const int n){ // vector<vi> e(n); // atcoder::dsu d(n); // for(lli i=1;i<n;++i){ // const lli u=readIntSp(1,n)-1; // const lli v=readIntLn(1,n)-1; // e[u].pb(v); // e[v].pb(u); // d.merge(u,v); // } // assert(d.size(0)==n); // return e; // } const lli INF = 0xFFFFFFFFFFFFFFFL; lli seed; mt19937 rng(seed=chrono::steady_clock::now().time_since_epoch().count()); inline lli rnd(lli l=0,lli r=INF) {return uniform_int_distribution<lli>(l,r)(rng);} class CMP {public: bool operator()(ii a , ii b) //For min priority_queue . { return ! ( a.X < b.X || ( a.X==b.X && a.Y <= b.Y )); }}; void add( map<lli,lli> &m, lli x,lli cnt=1) { auto jt=m.find(x); if(jt==m.end()) m.insert({x,cnt}); else jt->Y+=cnt; } void del( map<lli,lli> &m, lli x,lli cnt=1) { auto jt=m.find(x); if(jt->Y<=cnt) m.erase(jt); else jt->Y-=cnt; } bool cmp(const ii &a,const ii &b) { return a.X<b.X||(a.X==b.X&&a.Y<b.Y); } const lli mod = 1000000007L; // const lli maxN = 1000000007L; lli CompLIS(string s,string t){ const lli n = sz(s); vector<vi> dp(n,vi(n,-1)); auto solve=y_combinator([&](const auto &self,lli i,lli j)->lli{ if(i<0||j<0) return 0; lli &ans=dp[i][j]; if(ans!=-1) return ans; if(s[i]==t[j]) return ans=1+self(i-1,j-1); return ans=0; }); lli ans=0; for(lli i=0;i<n;i++) for(lli j=0;j<n;j++) ans=max(ans,solve(i,j)); dbg(ans,s,t); return ans; } int correct(int oc, int zc) { string a = ""; string b = ""; int x = zc; int y = oc; if (x < y) { rep(x) { a += '0'; } rep(y) { a += '1'; } int div = x + 1; int par = y % div; int minm = y / div; string temp = ""; string temp1 = ""; rep(minm) { temp += '1'; temp1 += '1'; } temp += '1'; temp += '0'; temp1 += '0'; rep(par) { b += temp; } rep(x + 1 - par) { b += temp1; } b.pop_back(); } else { rep(y) { a += '1'; } rep(x) { a += '0'; } int div = y + 1; int par = x % div; int minm = x / div; string temp = ""; string temp1 = ""; rep(minm) { temp += '0'; temp1 += '0'; } temp += '0'; temp += '1'; temp1 += '1'; rep(par) { b += temp; } rep(y + 1 - par) { b += temp1; } b.pop_back(); } return CompLIS(a,b); } int main(void) { ios_base::sync_with_stdio(false);cin.tie(NULL); // freopen("txt.in", "r", stdin); // freopen("txt.out", "w", stdout); // cout<<std::fixed<<std::setprecision(35); lli T=readIntLn(1,1e3); lli sumN = 3e3; while(T--) { lli n=readIntLn(1,min(1000LL,sumN)); sumN-=n; string s = readStringLn(n,n); assert(isBinaryString(s)); sort(all(s)); cout<<s<<endl; vi a(2); for(auto x:s) a[x-'0']++; bool fl=false; if(a[1]<a[0]){ swap(a[0],a[1]); fl=true; } string t=""; const lli pt = a[0]+1; const lli len = a[1]; const lli b1 = (len+pt-1)/pt; const lli c1 = len%pt; const lli b2 = len/pt; const lli c2 = pt-c1; dbg(b1,b2,c1,c2,a); for(lli i=0;i<c1;i++) t+=string(b1,'1')+'0'; for(lli i=0;i<c2;i++) t+=string(b2,'1')+'0'; t.pop_back(); if(fl){ swap(a[0],a[1]); for(auto &x:t) x^=1; } lli ans1=CompLIS(s,t); reverse(all(t)); lli ans2=CompLIS(s,t); if(ans1<ans2){ reverse(all(t)); swap(ans1,ans2); } const lli cans = correct(a[0],a[1]); if(ans1!=cans) cerr<<a[0]<<","<<a[1]<<":"<<ans1<<","<<cans<<endl; assert(ans1>=cans); dbg(ans1,cans,a); cout<<t<<endl; } aryanc403(); readEOF(); return 0; }