import
java.util.Arrays;
import
java.util.Vector;
import
java.util.Collections;
public
class
Main {
static
long
ans =
0
;
static
Vector<Vector<Long>> dp;
static
void
rec(
int
cur,
int
par, String C,
Vector<Long> total,
Vector<Vector<Integer>> adj) {
for
(
int
next : adj.get(cur)) {
if
(par == next)
continue
;
rec(next, cur, C, total, adj);
for
(
int
i =
0
; i <
26
; i++) {
ans += dp.get(cur).get(i) * dp.get(next).get(i) *
2
;
dp.get(cur).set(i, dp.get(cur).get(i) + dp.get(next).get(i));
}
}
for
(
int
i =
0
; i <
26
; i++) {
if
(i == (
int
) (C.charAt(cur) -
'a'
))
ans += dp.get(cur).get(i)
* (1L * total.get(i) - dp.get(cur).get(i) -
1
) *
2
;
else
ans += dp.get(cur).get(i)
* (1L * total.get(i) - dp.get(cur).get(i)) *
2
;
}
dp.get(cur).set(C.charAt(cur) -
'a'
, dp.get(cur).get(C.charAt(cur) -
'a'
) +
1
);
}
static
long
solve(
int
N,
int
[] p, String C) {
dp =
new
Vector<>(N +
1
);
for
(
int
i =
0
; i <= N; i++) {
dp.add(
new
Vector<>(Arrays.asList(
new
Long[
26
])));
Collections.fill(dp.get(i), 0L);
}
Vector<Long> arr =
new
Vector<>(Arrays.asList(
new
Long[
26
]));
Collections.fill(arr, 0L);
for
(
char
c : C.toCharArray())
arr.set(c -
'a'
, arr.get(c -
'a'
) +
1
);
Vector<Vector<Integer>> adj =
new
Vector<>(N);
for
(
int
i =
0
; i < N; i++) {
adj.add(
new
Vector<>());
}
for
(
int
i =
1
; i < N; i++) {
adj.get(p[i]).add(i);
}
rec(
0
, -
1
, C, arr, adj);
return
ans;
}
public
static
void
main(String[] args) {
int
N =
5
;
int
[] p = {-
1
,
0
,
0
,
1
,
1
};
String C =
"accaa"
;
System.out.println(solve(N, p, C));
}
}