#include //#pragma GCC optimize("O3") using namespace std; typedef long long ll; const int N = 1e6 + 3; const int M = 1e3 + 3; int n, e[N], t, st[N], en[N], ans[N], idx[N]; int dp[2][3 * M]; vector adj[N], imp; string s; bool s2[N], is_imp[N]; inline int max(int a, int b){ return ((a > b) ? a : b); } inline int min(int a, int b){ return ((a < b) ? a : b); } void chkmax(int &a, int b){ if(b > a) a = b; } void euler(int u, int p = -1){ st[u] = t; e[t++] = u; for(int to: adj[u]){ if(to == p) continue; euler(to, u); } en[u] = t; } void load_file(string s){ freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); load_file("monyo"); cin >> n; for(int i = 0; i < n - 1; ++i){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } cin >> s; euler(1); for(int i = 1; i <= n - 1; ++i) s2[i] = (s[e[i] - 2] - '0'); is_imp[1] = true; is_imp[n] = true; for(int i = n - 1; i >= 1; --i){ if(s2[i]){ is_imp[i] = true; is_imp[i + 1] = true; is_imp[en[e[i]]] = true; } } for(int i = n; i >= 1; --i){ if(is_imp[i]){ imp.push_back(i); idx[i] = imp.size() - 1; } } for(int i = 0; i < M; ++i){ bool curr = i & 1; bool nxt = (i + 1) & 1; dp[curr][0] = 0; for(int i = 1; i < imp.size(); ++i){ int u = imp[i]; if(!s2[u]) dp[curr][i] = dp[curr][i - 1] + imp[i - 1] - u; else{ dp[curr][i] = dp[curr][idx[ en[e[u]] ]]; chkmax(dp[curr][i], dp[nxt][i - 1]); } } ans[i] = dp[curr][imp.size() - 1]; } int prev = 1; for(int i = 0; i < M && prev <= n - 1; ++i){ for(int j = prev; j <= min(n - 1, ans[i] + i); ++j) cout << j - i << "\n"; prev = min(n - 1, ans[i] + i) + 1; } }