#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
struct G {
  long long n, m;
  int Next[400039];
  int head[100039];
  int ver[400039];
  int a[100039];
  int c[100039];
  int tot;
  void clear(int x) {
    tot = 0;
    memset(head, 0, (x + 3) * sizeof(int));
  }
  void add(int x, int y) { ver[++tot] = y, Next[tot] = head[x], head[x] = tot; }
} g;
int ff;
void dfs1(int x, int fa, int pro) {
  int fg = 0;
  for (int i = g.head[x]; i; i = g.Next[i]) {
    int y = g.ver[i];
    if (y == fa) continue;
    fg = 1;
    dfs1(y, x, pro ^ 0x1);
    break;
  }
  if (!fg) ff = pro;
}
map<int, int> pp;
long long sum = 0, gg = 0;
void dfs2(int x, int fa, int pro) {
  if (pro == ff)
    g.c[x] = 1, sum ^= g.a[x];
  else
    pp[g.a[x]]++, ++gg;
  for (int i = g.head[x]; i; i = g.Next[i]) {
    int y = g.ver[i];
    if (y == fa) continue;
    dfs2(y, x, pro ^ 0x1);
  }
}
int main() {
  scanf("%lld", &g.n);
  g.m = g.n - 1;
  for (int i = (1); i < g.n + 1; i++) scanf("%d", &g.a[i]);
  for (int i = (2); i < g.n + 1; i++) {
    int p;
    scanf("%d", &p);
    g.add(i, p), g.add(p, i);
  }
  dfs1(1, -1, 0);
  dfs2(1, -1, 0);
  long long ans = 0;
  for (int i = (1); i < g.n + 1; i++)
    if (g.c[i]) ans += pp[g.a[i] ^ sum];
  if (!sum) ans += (gg - 1) * gg / 2 + (g.n - gg - 1) * (g.n - gg) / 2;
  printf("%lld\n", ans);
  return 0;
}
