#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <stack> using namespace std; const int maxn = 12; int n; char maze[maxn][maxn],str[maxn*maxn]; int vis[maxn]; vector<int> son[maxn],topo; int ans[maxn]; void dfs(int u){ vis[u]=1; for(int i=0;i<son[u].size();i++) if(!vis[son[u][i]]){ dfs(son[u][i]); } topo.push_back(u); } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d",&n); scanf("%s",str); memset(maze,0,sizeof(maze)); for(int i=0;i<=n;i++) son[i].clear(); int k=0; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++){ switch(str[k++]){ case '+': son[j].push_back(i-1); break; case '-': son[i-1].push_back(j); break; case '0': maze[i-1][j]=maze[j][i-1]=1; break; } } memset(vis,0,sizeof(vis)); topo.clear(); for(int i=0;i<=n;i++){ if(!vis[i]) dfs(i); } int p; for(int i=0;i<topo.size();i++){ if(topo[i]==0) {p=i; break;} } int j=0; for(int i=p-1;i>=0;i--){ if(maze[topo[i]][topo[i+1]]) ans[topo[i]]=j; else ans[topo[i]]= (--j); } j=0; for(int i=p+1;i<topo.size();i++){ if(maze[topo[i]][topo[i-1]]) ans[topo[i]]=j; else ans[topo[i]]= (++j); } for(int i=1;i<=n;i++){ if(i!=1) printf(" "); printf("%d",ans[i]-ans[i-1]); } printf("\n"); } return 0; }