[problem:import java.lang.*; import java.io.*; import java.util.*;
public class B { static class FastReader { BufferedReader br; StringTokenizer st;
public FastReader() {
try {
br = new BufferedReader(
new FileReader("input.txt"));
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);
} catch (Exception e) {
br = new BufferedReader(new InputStreamReader(System.in));
}
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
static class Rating{
int rat;
int indx;
Rating(int r, int in){
rat = r;
indx = in;
}
}
// end of fast i/o code
public static void main(String[] args) {
FastReader reader = new FastReader();
int t = reader.nextInt();
while(t-->0){
int n = reader.nextInt();
int ratings[] = new int[n];
for(int indx = 0; indx<n; indx++){
ratings[indx] = reader.nextInt();
}
String likeDislike = reader.nextLine();
// System.out.println(likeDislike);
ArrayList<Rating> highRat = new ArrayList<>();
ArrayList<Rating> lowRat = new ArrayList<>();
for(int indx = 0; indx<n; indx++){
char rat = likeDislike.charAt(indx);
if(rat == '0'){
lowRat.add(new Rating(ratings[indx], indx));
}else{
highRat.add(new Rating(ratings[indx], indx));
}
}
Collections.sort(highRat, (a, b)->b.rat - a.rat);
Collections.sort(lowRat, (a, b)->b.rat - a.rat);
// for(Rating r : highRat){
// System.out.print(r.rat+" ");
// }
// System.out.println();
int maxRat = n, currRat = maxRat;
for(Rating r : highRat){
ratings[r.indx] = currRat--;
}
for(Rating r : lowRat){
ratings[r.indx] = currRat--;
}
for(int r : ratings){
System.out.print(r+" ");
}
System.out.println();
}
}}]




