`#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n;
string s;
void solve() {
memset (a, 0, sizeof a);
cin >> n;
vector<int> a(n);
for (int i = 0; i< n; i ++) {
int x;
cin >> x;
x --;
a[x] = i;
}
cin >> s;
int p1 = 1, p2 = 1;
for (int i = 0; i < n; i ++) if (s[i] == '0') p2 ++;
int zero = 0;
vector<int> ans(n);
for (int i = 0; i < n; i ++) {
if (s[a[i]] == '0') ans[a[i]] = p1 ++;
else {
ans[a[i]] = p2 ++;
}
}
for (int i = 0; i < n; i ++) cout << ans[i] << " ";
puts("");
}
int main () {
int t;
cin >>t;
while (t --) solve();
return 0;
}
贪心。从小到大排序。因为值的范围为1~N,所以1应该对应最小的值。如果为0的话。 否则就用对接近的值