#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const long long INFLL = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 1e5 + 5;
int a[MAXN];
vector<int> q[2];
vector<int> G[MAXN];
int vis[2][MAXN * 100];
int dfs(int n) {
  if (G[n].empty()) {
    q[0].push_back(n);
    vis[0][a[n]]++;
    return 1;
  }
  int r;
  for (int i = 0; i < G[n].size(); i++) {
    r = dfs(G[n][i]);
  }
  q[r % 2].push_back(n);
  vis[r % 2][a[n]]++;
  return r + 1;
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 2; i <= n; i++) {
    int x;
    scanf("%d", &x);
    G[x].push_back(i);
  }
  dfs(1);
  long long cnt = 0;
  int tot = a[q[0][0]];
  for (int i = 1; i < q[0].size(); i++) {
    tot ^= a[q[0][i]];
  }
  if (!tot) {
    for (int i = 0; i < q[0].size(); i++) {
      int num = q[0][i];
      cnt += vis[1][a[num]];
    }
    cnt += (q[0].size() * (int)(q[0].size() - 1) / 2);
    cnt += (q[1].size() * (int)(q[1].size() - 1) / 2);
  } else {
    for (int i = 0; i < q[0].size(); i++) {
      int num = q[0][i];
      if ((tot ^ a[num]) > (int)1e7) continue;
      cnt += vis[1][tot ^ a[num]];
    }
  }
  printf("%I64d\n", cnt);
}
