Problem:
Score : 1900 points

Problem Statement

There is a tree with N vertices.
The vertices are numbered 1 through N.
For each 1 ≤ i ≤ N - 1, the i-th edge connects vertices a_i and b_i.
The lengths of all the edges are 1.

Snuke likes some of the vertices.
The information on his favorite vertices are given to you as a string s of length N.
For each 1 ≤ i ≤ N, s_i is 1 if Snuke likes vertex i, and 0 if he does not like vertex i.

Initially, all the vertices are white.
Snuke will perform the following operation exactly once:

Select a vertex v that he likes, and a non-negative integer d. Then, paint all the vertices black whose distances from v are at most d.

Find the number of the possible combinations of colors of the vertices after the operation.

Constraints

2 ≤ N ≤ 2×10^5

1 ≤ a_i, b_i ≤ N

The given graph is a tree.

|s| = N

s consists of 0 and 1.

s contains at least one occurrence of 1.

Partial Score

In the test set worth 1300 points, s consists only of 1.

Input

The input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
:
a_{N - 1} b_{N - 1}
s

Output

Print the number of the possible combinations of colors of the vertices after the operation.

Sample Input 1

4
1 2
1 3
1 4
1100

Sample Output 1

4

The following four combinations of colors of the vertices are possible:

Sample Input 2

5
1 2
1 3
1 4
4 5
11111

Sample Output 2

11

This case satisfies the additional constraint for the partial score.

Sample Input 3

6
1 2
1 3
1 4
2 5
2 6
100011

Sample Output 3

8

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i, x, n) for(int i = x; i < (int)n; ++i)

vector<int> tr[200001];
int n, C, mxp[200001];
ll an = 0;

int fc(int v = 1, int p = 0){
	int an = 1;
	bool ok = true;
	f(i, 0, tr[v].size())if (tr[v][i] != p){
		int t = fc(tr[v][i], v);
		an += t;
		if (t > n >> 1)ok = false;
	}
	if (n - an > n >> 1)ok = false;
	if (ok)C = v;
	return an;
}

int go(int v = C, int p = 0){
	int &mx = mxp[v];
	mx = 1;
	f(i, 0, tr[v].size())if (tr[v][i] != p)mx = max(mx, 1 + go(tr[v][i], v));
	an += mx + 1;
	return mx;
}

int main(){
	scanf("%d", &n);
	f(i, 1, n){
		int a, b;
		scanf("%d%d", &a, &b);
		tr[a].push_back(b);
		tr[b].push_back(a);
	}
	fc();
	go();
	--an;
	vector<int> &v = tr[C];
	int mn = 1e9;
	f(i, 0, v.size())mn = min(mn, mxp[v[i]]);
	int z = 0;
	f(i, 0, v.size())if (mxp[v[i]] > mn)++z;
	if (z == 1)--an;
	printf("%lld\n", an);
}