#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
typedef long long LL;
int size[MAXN],maxLeft;
bool vis[MAXN];
vector<int> edge[MAXN];
LL x[MAXN],y[MAXN];
LL ans;
char a[MAXN];
int root,totsize,maxSize;
int maxRight;
void calc(int u,int fa)
{
	size[u] = 1;
	for (int v:edge[u])
	{
		if (v!=fa && vis[v]==false)
		{
			calc(v,u);
			size[u]+=size[v];
		}
	}
}
int getRoot(int u,int fa)
{
	int mx = -1;
	for (int v:edge[u])
	{
		if (v!=fa && vis[v]==false)
		{
			getRoot(v,u);
			mx = max(mx,size[v]);
		}
	}
	mx = max(mx,totsize - size[u]);
	if (mx < maxSize)
	{
		maxSize = mx;
		root = u;
	}
}
int search(int u,int fa)
{
	maxSize = 1e9; 
	calc(u,fa);
	totsize = size[u];
	getRoot(u,fa);
	return root;
}
void dfs2(int u,int fa,int left,int tot1,int right,int tot2)
{
	if (a[u]=='(') 
	{
		left++;
		tot1++;
		if (tot1>=0) 
		{
			x[left]++;
			maxLeft = max(maxLeft,left);	
		}
		right--;
		if (tot2>=0) tot2 = -1;
		else tot2--; 
	}
	else 
	{
		right++;
		tot2++;
		if (tot2>=0) 
		{
			y[right]++;
			maxRight = max(maxRight,right);	
		}
		
		left--;
		if (tot1 >= 0) tot1 = -1;
		else tot1--;
	}
	for (int v:edge[u])
	{
		if (v!=fa && vis[v]==false) dfs2(v,u,left,tot1,right,tot2);
	}
}
void dfs(int u,int fa)
{
	if (fa!=-1) vis[fa] = true;
	int newroot = search(u,fa);
	//cout<<newroot<<' '<<fa<<endl;
	for (int i=0;i<=maxLeft;i++) x[i] = 0;
	for (int i=0;i<=maxRight;i++) y[i] = 0;
	maxLeft = maxRight = 0;
	//memset(x,0,sizeof(x));
	//memset(y,0,sizeof(y));
	x[0] = y[0] = 1;
	for (int v:edge[newroot])
	{
		if (vis[v]==false && v!=fa) dfs2(v,newroot,0,0,0,0);
	}
	if (a[newroot]=='(')
	{
		for (int i=0;i<=maxLeft;i++)
		{
			ans = (ans + x[i] * y[i+1]);
		}
	}
	else
	{
		for (int i=1;i<=maxLeft;i++)
		{
			ans = (ans + x[i] * y[i-1]);
		}
	}
	//cout<<"ans: "<<ans<<endl;
	for (int v:edge[newroot])
	{
		if (vis[v] || v==fa) continue;
		//memset(x,0,sizeof(x));
		//memset(y,0,sizeof(y));
		//x[0] = y[0] = 1;
		for (int i=0;i<=maxLeft;i++) x[i] = 0;
		for (int i=0;i<=maxRight;i++) y[i] = 0;
		maxLeft = maxRight = 0;
		dfs2(v,newroot,0,0,0,0);
		if (a[newroot]=='(')
		{
			for (int i=0;i<=maxLeft;i++)
			{
				ans = (ans - x[i] * y[i+1]);
			}
		}
		else
		{
			for (int i=1;i<=maxLeft;i++)
			{
				ans = (ans - x[i] * y[i-1]);
			}
		}
	}
	//cout<<"ans: "<<ans<<endl;
	for (int v:edge[newroot])
	{
		if (v!=fa && vis[v]==false) dfs(v,newroot);
	}	
}
int main()
{
//	freopen("1.in","r",stdin); 
//	freopen("1.out","w",stdout);
	int n;
	scanf("%d\n",&n);
	for (int i=1;i<=n;i++) scanf("%c",a+i);
	for (int i=0;i<n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	dfs(1,-1);
	printf("%lld\n",ans);
}
