// Slower C++ solution:
#include<iostream>

#include<cstdio>

#include<vector>

#include<cstring>



using namespace std;



int n,x,y,siz[200001],fa[200001],maxs[200001],maxp[200001],mins[200001],minp[200001],maxl[200001],minn;

long long ans;

vector<int> point[200001];

char str[200001];



void dfs1(int u,bool check){

	siz[u]=str[u]-'0';

	for(int v:point[u])if(v!=fa[u]){

		fa[v]=u;

		dfs1(v,true);

		siz[u]+=siz[v],maxs[u]=max(maxs[u],maxs[v]+1);

		if(mins[v]<0x7f7f7f7f)mins[u]=min(mins[u],maxs[v]+1);

	}

	if(point[u].size()==check)maxs[u]=0,mins[u]=str[u]-'0'?0:0x7f7f7f7f;else if(str[u]-'0')mins[u]=min(mins[u],maxs[u]);

}



void dfs2(int u,bool check){

	maxp[u]=max(maxp[u],check+maxp[fa[u]]);

	if(check)maxl[u]=max(maxl[u],maxp[u]-1);

	int mx=-1;for(int v:point[u])if(v!=fa[u])maxp[v]=max(maxp[v],mx+2),mx=max(mx,maxs[v]);

	mx=-1;for(int i=point[u].size()-1;~i;--i){int v=point[u][i];if(v!=fa[u])maxp[v]=max(maxp[v],mx+2),mx=max(mx,maxs[v]);}

	for(int v:point[u])if(v!=fa[u])dfs2(v,true);

}



int main(){

	memset(mins,0x7f,sizeof(mins)),memset(minp,0x7f,sizeof(minp));

	scanf("%d",&n);for(int i=1;i<n;++i)scanf("%d%d",&x,&y),point[x].push_back(y),point[y].push_back(x);scanf("%s",str+1);

	dfs1(1,false),dfs2(1,false);

	for(int i=1;i<=n;++i){

		if(str[i]-'0')minn=0;else minn=min(mins[i],siz[i]==siz[1]?2147483647:maxp[i]);

		int d=max(maxs[i],maxp[i])-1;for(int v:point[i])if(v!=fa[i])d=min(d,maxl[v]+1);else d=min(d,maxs[i]+1);

		if(d>=minn)ans+=d-minn+1;

	}

	printf("%lld",ans+1);

}

// Faster C++ solution for the same problem (measured speedup: 8.39403129006298x):
#include<iostream>

#include<cstdio>

using namespace std;



int d1[200005],d2[200005];

int d3[200005],d4[200005];

//d1:子树中的最远距离

//d2:非子树中的最远距离

//d3:这个节点到子树中至少经过1个特殊节点到达子树中的最远节点最小距离 

//d4:从他父亲出发，不经过这棵子树的最远路径 

int n,x,y,siz[200005],col[200005],fa[200005];

long long ans=0;

int tot=0,h[200005];

struct Edge{

    int x,next;

}e[400005];

char ch[200005];



inline void add_edge(int x,int y){

    e[++tot].x=y;

    e[tot].next=h[x],h[x]=tot;

}



void dfs1(int x,int father){

    siz[x]=col[x],fa[x]=father;

    d3[x]=col[x]?0:1e9;

    for(int i=h[x];i;i=e[i].next){

        if(e[i].x==father)continue;

        dfs1(e[i].x,x);

        siz[x]+=siz[e[i].x];

        d1[x]=max(d1[x],d1[e[i].x]+1);

        if(siz[e[i].x])

            d3[x]=min(d3[x],d1[e[i].x]+1);

    }

}



void dfs2(int x,int father){

    if(father)d4[x]=d2[x]-1;

    int maxn=0,sec=0;

    for(int i=h[x];i;i=e[i].next){

        if(e[i].x==father)continue;

        if(d1[e[i].x]+1>maxn)

            sec=maxn,maxn=d1[e[i].x]+1;

        else sec=max(sec,d1[e[i].x]+1);

    }

    for(int i=h[x];i;i=e[i].next){

        if(e[i].x==father)continue;

        if(d1[e[i].x]+1==maxn)

            d2[e[i].x]=max(d2[x],sec)+1;

        else d2[e[i].x]=max(d2[x],maxn)+1;

        dfs2(e[i].x,x);

    }

}



int main(){

    scanf("%d",&n);

    for(int i=1;i<n;i++){

        scanf("%d%d",&x,&y);

        add_edge(x,y);

        add_edge(y,x);

    }

    scanf("%s",ch+1);

    for(int i=1;ch[i];i++)

        col[i]=ch[i]-'0';

    dfs1(1,0),dfs2(1,0);

    for(int i=1;i<=n;i++){

        int minv,maxv;

        minv=min(d3[i],siz[1]==siz[i]?(int)1e9:d2[i]);

        maxv=max(d1[i],d2[i])-1;

        for(int j=h[i];j;j=e[j].next){

            if(e[j].x==fa[i])maxv=min(maxv,d1[i]+1);

            else maxv=min(maxv,d4[e[j].x]+1);

        }

        if(maxv>=minv)ans+=1LL*maxv-minv+1;

    }

    printf("%lld",ans+1);

}