
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
typedef long long LL;
const int INF=0x7fffffff;
const int maxn=100001;

int n;
char s[maxn+1];

struct PT {
	int n=0;
	vector<int> sd[maxn];
	bool vis[maxn];

	int rt,mins,total;
	int sz[maxn];

	LL lst[maxn],rst[maxn]; int mxgs;

	void init(int N) {
		FOR (i,1,n) vis[i]=0,sd[i].clear();
		n=N;
	}
	void adde(int u,int v) { sd[u].pb(v); sd[v].pb(u); }

	void dfs(int u,int fa) {
		sz[u]=1;
		int mx=0,t;
		for (int &v:sd[u]) if (!vis[v]&&v!=fa) {
			dfs(v,u);
			sz[u]+=sz[v];
			mx=max(mx,sz[v]);  //mx居然取的是size ⊙o⊙ 
		}
		if ((t=max(mx,total-sz[u]))<mins) mins=t,rt=u;
	}
	void bl(int u,int fa,int MS[],int gs) {
		int ms[2]={MS[0],MS[1]};
		if (s[u]=='(') {
			ms[0]++; gs++;
			ms[1]=min(-1,ms[1]-1); 
		}
		else {
			ms[0]=min(-1,ms[0]-1); gs--;
			ms[1]++;
		}
		//if (u==1) cout<<ms[0]<<" "<<ms[1]<<" "<<gs<<endl;
		for (int &v:sd[u]) if (!vis[v]&&v!=fa)
			bl(v,u,ms,gs);
		if (ms[0]>=0) lst[gs]++,assert(gs>=0);
		if (ms[1]>=0) rst[gs=-gs]++,assert(gs>=0);
		//cout<<ms[0]<<" "<<ms[1]<<" "<<gs<<endl;
		mxgs=max(mxgs,gs);
	}
	LL cal(int u) {
		int ms[2]={0};
		mxgs=-1;
		for (int &v:sd[u]) if (!vis[v]) {
			ms[0]=ms[1]=0;
			bl(v,u,ms,0);
		}
		LL ret=0;
		if (s[u]=='(') {
			for (int i=0;i<mxgs;i++) ret+=lst[i]*rst[i+1];
			ret+=rst[1];
		}
		else {
			for (int i=0;i<mxgs;i++) ret+=lst[i+1]*rst[i];
			ret+=lst[1];
		}
		//cout<<lst[0]<<" .. "<<lst[1]<<endl;
		//cout<<rst[0]<<" .. "<<rst[1]<<endl;

		//if (u==2) cout<<lst[0][1]<<endl;
		//cout<<u<<" "<<sz[u]<<" "<<ret<<endl;
		for (int i=0;i<=mxgs;i++) lst[i]=rst[i]=0;
		//for (int i=0;i<=mxgs;i++) lst[0][i]=lst[1][i]=rst[0][i]=rst[1][i]=0;
		return ret;
	}
	LL cal2(int u,char c) {
		int ms[2]={0};
		mxgs=-1; bl(u,-1,ms,0);
		LL ret=0;
		if (c=='(') {
			for (int i=0;i<mxgs;i++) ret+=lst[i]*rst[i+1];
		}
		else {
			for (int i=0;i<mxgs;i++) ret+=lst[i+1]*rst[i];
		}
		//cout<<u<<" "<<sz[u]<<" "<<ret<<endl;

		for (int i=0;i<=mxgs;i++) lst[i]=rst[i]=0;
		return ret;
	}
	LL sol(int u,int tot) {
		mins=INF; total=tot; dfs(u,-1);
		u=rt; vis[rt]=1; dfs(u,-1);  //第二个dfs是为了子树的sol而做的
		//cout<<"zhongxing:"<<u<<endl;

		LL ret=cal(u);
		for (int &v:sd[u]) if (!vis[v])
			ret-=cal2(v,s[u]),ret+=sol(v,sz[v]);

		//vis[u]=0;
		//cout<<u<<" "<<ret<<endl;
		return ret;
	}
} pt;

int main() {
	for (;~scanf("%d%s",&n,s+1);) {
	//scanf("%d%s",&n,s+1); {
		pt.init(n);
		for (int i=1,a,b;i<n;i++) {
			scanf("%d%d",&a,&b);
			pt.adde(a,b);
		}
		printf("%lld\n",pt.sol(1,n));
	}
	return 0;
}
