70分
#include<bits/stdc++.h>
#define rd read()
#define N 40005
#define K 20005
#define inf INT_MAX
#define int long long
using namespace std;
int n,m,q,k,ans,rt,siz[N],mx[N],x,y,w[N],tot,vis[N];
int cnt1,cnt2,g[N];
char c;
map<int,int>rmx1,rmx2,ok1,ok2;
vector<int>v[N];
struct Node{
int sum,lmx,lmn,rmx,rmn;
inline Node operator + (const int &o)const{return {sum+o,max(lmx,sum+o),min(lmn,sum+o),max(o,rmx+o),min(o,rmn+o)};}//(((+)
inline void Swap(){swap(lmx,rmx),swap(lmn,rmn);}
}s[N];
inline Node operator + (const int &x,const Node &y){return {y.sum+x,max(x,y.lmx+x),min(x,y.lmn+x),max(y.rmx,y.sum+x),min(y.rmn,y.sum+x)};}//)+(((
inline int read()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x;
}
inline void out(Node o){cout<<o.sum<<' '<<o.lmx<<' '<<o.lmn<<' '<<o.rmx<<' '<<o.rmn<<'\n';}
inline void dfs1(int x,int f){
siz[x]=1,mx[x]=0;
for(auto t:v[x]){
if(t==f||vis[t]) continue;
dfs1(t,x);
siz[x]+=siz[t];
mx[x]=max(mx[x],siz[t]);
}
mx[x]=max(mx[x],tot-siz[x]);
if(mx[x]<mx[rt]) rt=x;
}
inline void find(int x,int f,Node d){
d=w[x]+d;
s[++cnt1]=d;
// cout<<x<<' ';out(d);
for(auto t:v[x]){
if(t==f||vis[t]) continue;
find(t,x,d);
}
}
inline void solve(int x){
ok1[0]=1,ok2[0]=1;
for(auto t:v[x]){
if(vis[t]) continue;
cnt1=0;
find(t,x,{0,0,0,0,0});
for(int i=1;i<=cnt1;i++){
Node T1=s[i]+w[x];
// out(T1);
if(s[i].rmn>=0&&!s[i].sum) ans=max(ans,s[i].rmx);
if(s[i].lmn>=0&&!s[i].sum) ans=max(ans,s[i].lmx);
if(T1.rmn>=0&&!T1.sum) ans=max(ans,T1.rmx);
if(T1.lmn>=0&&!T1.sum) ans=max(ans,T1.lmx);
s[i].Swap();
Node T2=s[i]+w[x];
if(T2.rmn>=0&&!T2.sum) ans=max(ans,T2.rmx);
if(T2.lmn>=0&&!T2.sum) ans=max(ans,T2.lmx);
// out(T2);
s[i].Swap();
if(T1.lmx<=0&&ok1[-T1.sum]) ans=max(ans,max(T1.rmx-T1.sum,rmx1[-T1.sum]));
if(T2.rmn>=0&&ok2[-T2.sum]) ans=max(ans,max(T2.rmx,rmx2[-T2.sum]+T2.sum));
}
for(int i=1;i<=cnt1;i++){
if(s[i].rmn>=0) ok1[s[i].sum]=1,rmx1[s[i].sum]=max(rmx1[s[i].sum],s[i].rmx);
if(s[i].lmx<=0) ok2[s[i].sum]=1,rmx2[s[i].sum]=max(rmx2[s[i].sum],s[i].rmx);
}
}
rmx1.clear();rmx2.clear();ok1.clear();ok2.clear();
}
inline void dfs2(int x){
vis[x]=1;
solve(x);
for(auto t:v[x]){
if(vis[t]) continue;
tot=siz[t];rt=0;
dfs1(t,x);
dfs2(rt);
}
}
signed main(){
// freopen("P3060_6.in","r",stdin);
cout.tie(0);
n=rd;
for(int i=2;i<=n;i++){
x=rd;
v[x].push_back(i);
v[i].push_back(x);
}
for(int i=1;i<=n;i++){
cin>>c;
if(c=='(') w[i]=1;
else w[i]=-1;
}
srand(time(0));
mx[rt]=INT_MAX;tot=n;
dfs1(1,0);
dfs2(rt);
cout<<ans;
return 0;
}
/*
2
1
(
)
*/