#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+10;
ll n,ans,sz[N],cnt[N+N];
int a[N];
string s;
vector<int>v[N];
bool bio[N];
int Precompute(int node,int parent){
sz[node]=1;
for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]])sz[node]+=Precompute(v[node][i],node);
return sz[node];
}
int FindCentroid(int node,int parent,int vel){
for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]] and sz[v[node][i]]>vel/2)return FindCentroid(v[node][i],node,vel);
return node;
}
void dfs1(int node,int parent,int sum,int mpref,int val,bool b,int suf){
//if(b)cout<<"___________________\ndfs1: "<<node<<' '<<mpref<<' '<<sum<<'\n';
mpref=min(sum,mpref);
suf=max(0,suf);
if(suf<=0)cnt[sum+N]+=val;
if(b and mpref>=0 and sum==0 and suf<=0)ans++;
//if(b)cout<<"_____________ dfs1:\nnode: "<<node<<"\nmpref: "<<mpref<<"\nsuf: "<<suf<<"\nsum: "<<sum<<'\n';
for(int i=0;i<v[node].size();i++)
if(v[node][i]!=parent and !bio[v[node][i]]){
dfs1(v[node][i],node,sum+a[v[node][i]],mpref,val,b,suf+a[v[node][i]]);
}
return;
}
void dfs2(int node,int parent,int sum,int mpref){
mpref=min(0,mpref);
if(mpref>=0)ans+=cnt[-sum+N];
//cout<<node<<' '<<mpref<<' '<<sum<<' '<<cnt[-sum+N]<<'\n';
for(int i=0;i<v[node].size();i++)if(v[node][i]!=parent and !bio[v[node][i]]){
dfs2(v[node][i],node,sum+a[v[node][i]],mpref+a[v[node][i]]);
}
return;
}
void CentroidDecomposition(int node,int parent){
Precompute(node,-1);
node=FindCentroid(node,-1,sz[node]);
//cout<<"CentroidDecomposition: "<<node<<'\n';
if(s[node]==')')cnt[-1+N]++;
for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node]),1,1,max(0,a[node])+a[v[node][i]]);
}
for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node])+a[v[node][i]],-1,0,max(0,a[node])+a[v[node][i]]);
//cout<<"dfs2: "<<v[node][i]<<'\n';
dfs2(v[node][i],node,a[v[node][i]],a[v[node][i]]);
dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node])+a[v[node][i]],1,0,max(0,a[node])+a[v[node][i]]);
}
if(s[node]==')')cnt[-1+N]--;
for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]]){
dfs1(v[node][i],node,a[node]+a[v[node][i]],min(0,a[node]),-1,0,max(0,a[node])+a[v[node][i]]);
}
//cout<<"ANS: "<<ans<<'\n';
bio[node]=1;
for(int i=0;i<v[node].size();i++)if(!bio[v[node][i]])CentroidDecomposition(v[node][i],node);
return;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n>>s;
for(int i=0;i<n;i++)a[i]=(s[i]=='(')-(s[i]==')');
//cout<<'\n';
for(int i=1;i<n;i++){
int xi,yi;
cin>>xi>>yi,xi--,yi--;
v[xi].push_back(yi);
v[yi].push_back(xi);
}
//cnt[0+N]++;
CentroidDecomposition(0,-1);
cout<<ans<<'\n';
return 0;
}