/// no time to waste
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define eb emplace_back
#define ef emplace_front
#define pii pair <int, int>
#define pli pair <ll, int>
#define pll pair <ll, ll>
#define pci pair <char, int>
#define pil pair <int, ll>
#define pic pair <int, char>
#define pib pair <int, bool>
#define pbi pair <bool, int>
#define pcc pair <char, char>
#define fi first
#define se second
#define all(ac) ac.begin(), ac.end()
#define MASK(x) (1 << (x))
#define ub(i, j) (((i) >> (j)) & 1)
#define FBIT(x) (MASK(x) - 1)
#define FLIP(x, y) (FBIT(x) ^ (y))
#define bit_count(x) (int) (__builtin_popcount(x))
#define bit_countll(x) (int) (__builtin_popcountll(x))
#define ii make_pair
#define int128 __int128_t
#define SZ(x) ((int) x.size())
#define multi 0
const int MX = 4e4 + 4;
int n;
char ch[MX];
int w[MX];
struct node {
int w, mx, mn;
node(int w = 0, int mx = 0, int mn = 0): w(w), mx(mx), mn(mn) {}
};
vector <int> G[MX];
int sz[MX];
bool del[MX];
int DFS(int u, int par) {
sz[u] = 1;
for(int &v : G[u]) if(!del[v] && v != par) {
sz[u] += DFS(v, u);
}
return sz[u];
}
int find_centroid(int u, int par, int half) {
for(int &v : G[u]) if(!del[v] && sz[v] > half && v != par) {
return find_centroid(v, u, half);
}
return u;
}
int fd[MX << 1], fu[MX << 1];
int res;
vector <node> cur;
void DFS2(int u, int par, node tmp) {
cur.eb(tmp);
for(int &v : G[u]) if(!del[v] && v != par) {
int cw = w[ch[v]];
DFS2(v, u, node(tmp.w + cw, max(tmp.mx, tmp.w + cw), min(tmp.mn, tmp.w + cw)));
}
return;
}
void solve(int u) {
int root = find_centroid(u, -1, DFS(u, -1) >> 1);
del[root] = 1;
int w_root = w[ch[root]];
if(w_root > 0) fu[w_root + MX] = 1;
fd[MX] = 0;
vector <int> tr = {MX, w_root + MX};
for(int &v : G[root]) if(!del[v]) {
DFS2(v, -1, node(w[ch[v]], max(0, w[ch[v]]), min(w[ch[v]], 0)));
for(node x : cur) {
if(x.mn == x.w && fu[MX - x.w] >= 0) {
res = max(res, max(x.mx - x.w, fu[MX - x.w]));
}
int m = x.w - x.mx;
x.mx = x.w - x.mn;
x.mn = m;
if(min(x.mn, x.w + w_root) >= 0 && fd[MX - x.w - w_root] >= 0) {
res = max(max(res, fd[MX - x.w - w_root]), max(x.mx, x.w + w_root));
}
}
for(node &x : cur) {
if(x.mn == x.w) {
fd[x.w + MX] = max(fd[x.w + MX], x.mx - x.w);
tr.eb(x.w + MX);
}
int m = x.w - x.mx;
x.mx = x.w - x.mn;
x.mn = m;
if(min(x.mn, x.w + w[ch[root]]) >= 0) {
int id = x.w + w[ch[root]] + MX;
fu[id] = max(fu[id], max(x.mx, x.w + w_root));
tr.eb(id);
}
}
cur.clear();
}
for(int &i : tr) fd[i] = fu[i] = -1e9;
for(int &v : G[root]) if(!del[v]) {
solve(v);
}
return;
}
void solve() {
cin >> n;
for(int i = 2; i <= n; i++) {
int p; cin >> p;
G[p].eb(i);
G[i].eb(p);
}
w['('] = 1;
w[')'] = -1;
for(int i = 1; i <= n; i++) cin >> ch[i];
memset(fu, -63, sizeof fu);
memset(fd, -63, sizeof fd);
solve(1);
cout << res;
return;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
#define task "treeb"
if(fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int testcase = multi == 2 ? 1e9 : 1; if(multi == 1) cin >> testcase;
while(testcase--) solve();
return 0;
}
Ly8vIG5vIHRpbWUgdG8gd2FzdGUKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBlZiBlbXBsYWNlX2Zyb250CiNkZWZpbmUgcGlpIHBhaXIgPGludCwgaW50PgojZGVmaW5lIHBsaSBwYWlyIDxsbCwgaW50PgojZGVmaW5lIHBsbCBwYWlyIDxsbCwgbGw+CiNkZWZpbmUgcGNpIHBhaXIgPGNoYXIsIGludD4KI2RlZmluZSBwaWwgcGFpciA8aW50LCBsbD4KI2RlZmluZSBwaWMgcGFpciA8aW50LCBjaGFyPgojZGVmaW5lIHBpYiBwYWlyIDxpbnQsIGJvb2w+CiNkZWZpbmUgcGJpIHBhaXIgPGJvb2wsIGludD4KI2RlZmluZSBwY2MgcGFpciA8Y2hhciwgY2hhcj4KI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGFsbChhYykgYWMuYmVnaW4oKSwgYWMuZW5kKCkKI2RlZmluZSBNQVNLKHgpICgxIDw8ICh4KSkKI2RlZmluZSB1YihpLCBqKSAoKChpKSA+PiAoaikpICYgMSkKI2RlZmluZSBGQklUKHgpIChNQVNLKHgpIC0gMSkKI2RlZmluZSBGTElQKHgsIHkpIChGQklUKHgpIF4gKHkpKQojZGVmaW5lIGJpdF9jb3VudCh4KSAoaW50KSAoX19idWlsdGluX3BvcGNvdW50KHgpKQojZGVmaW5lIGJpdF9jb3VudGxsKHgpIChpbnQpIChfX2J1aWx0aW5fcG9wY291bnRsbCh4KSkKI2RlZmluZSBpaSBtYWtlX3BhaXIKI2RlZmluZSBpbnQxMjggX19pbnQxMjhfdAojZGVmaW5lIFNaKHgpICgoaW50KSB4LnNpemUoKSkKI2RlZmluZSBtdWx0aSAwCgpjb25zdCBpbnQgTVggPSA0ZTQgKyA0OwppbnQgbjsKY2hhciBjaFtNWF07CmludCB3W01YXTsKCnN0cnVjdCBub2RlIHsKICAgIGludCB3LCBteCwgbW47CiAgICBub2RlKGludCB3ID0gMCwgaW50IG14ID0gMCwgaW50IG1uID0gMCk6IHcodyksIG14KG14KSwgbW4obW4pIHt9Cn07Cgp2ZWN0b3IgPGludD4gR1tNWF07CmludCBzeltNWF07CmJvb2wgZGVsW01YXTsKCmludCBERlMoaW50IHUsIGludCBwYXIpIHsKICAgIHN6W3VdID0gMTsKICAgIGZvcihpbnQgJnYgOiBHW3VdKSBpZighZGVsW3ZdICYmIHYgIT0gcGFyKSB7CiAgICAgICAgc3pbdV0gKz0gREZTKHYsIHUpOwogICAgfQoKICAgIHJldHVybiBzelt1XTsKfQoKaW50IGZpbmRfY2VudHJvaWQoaW50IHUsIGludCBwYXIsIGludCBoYWxmKSB7CiAgICBmb3IoaW50ICZ2IDogR1t1XSkgaWYoIWRlbFt2XSAmJiBzelt2XSA+IGhhbGYgJiYgdiAhPSBwYXIpIHsKICAgICAgICByZXR1cm4gZmluZF9jZW50cm9pZCh2LCB1LCBoYWxmKTsKICAgIH0KCiAgICByZXR1cm4gdTsKfQoKaW50IGZkW01YIDw8IDFdLCBmdVtNWCA8PCAxXTsKaW50IHJlczsKdmVjdG9yIDxub2RlPiBjdXI7Cgp2b2lkIERGUzIoaW50IHUsIGludCBwYXIsIG5vZGUgdG1wKSB7CiAgICBjdXIuZWIodG1wKTsKICAgIGZvcihpbnQgJnYgOiBHW3VdKSBpZighZGVsW3ZdICYmIHYgIT0gcGFyKSB7CiAgICAgICAgaW50IGN3ID0gd1tjaFt2XV07CiAgICAgICAgREZTMih2LCB1LCBub2RlKHRtcC53ICsgY3csIG1heCh0bXAubXgsIHRtcC53ICsgY3cpLCBtaW4odG1wLm1uLCB0bXAudyArIGN3KSkpOwogICAgfQoKICAgIHJldHVybjsKfQoKdm9pZCBzb2x2ZShpbnQgdSkgewogICAgaW50IHJvb3QgPSBmaW5kX2NlbnRyb2lkKHUsIC0xLCBERlModSwgLTEpID4+IDEpOwogICAgZGVsW3Jvb3RdID0gMTsKCiAgICBpbnQgd19yb290ID0gd1tjaFtyb290XV07CiAgICBpZih3X3Jvb3QgPiAwKSBmdVt3X3Jvb3QgKyBNWF0gPSAxOwogICAgZmRbTVhdID0gMDsKCiAgICB2ZWN0b3IgPGludD4gdHIgPSB7TVgsIHdfcm9vdCArIE1YfTsKICAgIGZvcihpbnQgJnYgOiBHW3Jvb3RdKSBpZighZGVsW3ZdKSB7CiAgICAgICAgREZTMih2LCAtMSwgbm9kZSh3W2NoW3ZdXSwgbWF4KDAsIHdbY2hbdl1dKSwgbWluKHdbY2hbdl1dLCAwKSkpOwoKICAgICAgICBmb3Iobm9kZSB4IDogY3VyKSB7CiAgICAgICAgICAgIGlmKHgubW4gPT0geC53ICYmIGZ1W01YIC0geC53XSA+PSAwKSB7CiAgICAgICAgICAgICAgICByZXMgPSBtYXgocmVzLCBtYXgoeC5teCAtIHgudywgZnVbTVggLSB4LnddKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBtID0geC53IC0geC5teDsKICAgICAgICAgICAgeC5teCA9IHgudyAtIHgubW47CiAgICAgICAgICAgIHgubW4gPSBtOwoKICAgICAgICAgICAgaWYobWluKHgubW4sIHgudyArIHdfcm9vdCkgPj0gMCAmJiBmZFtNWCAtIHgudyAtIHdfcm9vdF0gPj0gMCkgewogICAgICAgICAgICAgICAgcmVzID0gbWF4KG1heChyZXMsIGZkW01YIC0geC53IC0gd19yb290XSksIG1heCh4Lm14LCB4LncgKyB3X3Jvb3QpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yKG5vZGUgJnggOiBjdXIpIHsKICAgICAgICAgICAgaWYoeC5tbiA9PSB4LncpIHsKICAgICAgICAgICAgICAgIGZkW3gudyArIE1YXSA9IG1heChmZFt4LncgKyBNWF0sIHgubXggLSB4LncpOwogICAgICAgICAgICAgICAgdHIuZWIoeC53ICsgTVgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnQgbSA9IHgudyAtIHgubXg7CiAgICAgICAgICAgIHgubXggPSB4LncgLSB4Lm1uOwogICAgICAgICAgICB4Lm1uID0gbTsKCiAgICAgICAgICAgIGlmKG1pbih4Lm1uLCB4LncgKyB3W2NoW3Jvb3RdXSkgPj0gMCkgewogICAgICAgICAgICAgICAgaW50IGlkID0geC53ICsgd1tjaFtyb290XV0gKyBNWDsKICAgICAgICAgICAgICAgIGZ1W2lkXSA9IG1heChmdVtpZF0sIG1heCh4Lm14LCB4LncgKyB3X3Jvb3QpKTsKICAgICAgICAgICAgICAgIHRyLmViKGlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY3VyLmNsZWFyKCk7CiAgICB9CgogICAgZm9yKGludCAmaSA6IHRyKSBmZFtpXSA9IGZ1W2ldID0gLTFlOTsKCiAgICBmb3IoaW50ICZ2IDogR1tyb290XSkgaWYoIWRlbFt2XSkgewogICAgICAgIHNvbHZlKHYpOwogICAgfQoKICAgIHJldHVybjsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGNpbiA+PiBuOwogICAgZm9yKGludCBpID0gMjsgaSA8PSBuOyBpKyspIHsKICAgICAgICBpbnQgcDsgY2luID4+IHA7CiAgICAgICAgR1twXS5lYihpKTsKICAgICAgICBHW2ldLmViKHApOwogICAgfQoKICAgIHdbJygnXSA9IDE7CiAgICB3WycpJ10gPSAtMTsKCiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGNoW2ldOwoKICAgIG1lbXNldChmdSwgLTYzLCBzaXplb2YgZnUpOwogICAgbWVtc2V0KGZkLCAtNjMsIHNpemVvZiBmZCk7CiAgICAKICAgIHNvbHZlKDEpOwogICAgY291dCA8PCByZXM7CgogICAgcmV0dXJuOwp9CgppbnQzMl90IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApLCBjb3V0LnRpZSgwKTsKICAgICNkZWZpbmUgdGFzayAidHJlZWIiCiAgICBpZihmb3Blbih0YXNrIi5pbnAiLCAiciIpKSB7CiAgICAgICAgZnJlb3Blbih0YXNrIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKHRhc2siLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBpbnQgdGVzdGNhc2UgPSBtdWx0aSA9PSAyID8gMWU5IDogMTsgaWYobXVsdGkgPT0gMSkgY2luID4+IHRlc3RjYXNlOwogICAgd2hpbGUodGVzdGNhc2UtLSkgc29sdmUoKTsKICAgIHJldHVybiAwOwp9Cg==