#define _CRT_SECURE_NO_WARNINGS #define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING #include using namespace std; const int N = 1e5 + 50; int cnt[N], w[N], nx[N], adj[N], que[N], ans[N], fa[N], dep[N]; bool vis[N]; int main() { set s1, s2; for (int n; ~scanf("%d", &n);) { memset(cnt, 0, sizeof cnt); memset(ans, 0, sizeof ans); memset(vis, 0, sizeof vis); memset(adj, 0, sizeof adj); for (int i = 2; i <= n; i++) { scanf("%d", &fa[i]); nx[i] = adj[fa[i]]; adj[fa[i]] = i; } for (int i = 1; i <= n; i++) { scanf("%d", w + i); cnt[w[i]]++; } for (int i = 1; i <= n; i++) ans[i] = cnt[w[i]] > 1; int h = 0, t = 0; for (vis[que[t++] = 1] = true; h ^ t; h++) for (int x = adj[que[h]]; x; x = nx[x]) if (!vis[x]) vis[que[t++] = x] = true, dep[x] = dep[que[h]] + 1; for (int i = t - 1; i; i--) ans[fa[que[i]]] += ans[que[i]]; pair ans1{-1, -1}, ans2{-1, -1}; for (int i = 1; i <= n; i++) { pair cur = {ans[i], i}; if (ans1 < cur) { ans2 = ans1; ans1 = cur; } else if (ans2 < cur) { ans2 = cur; } } memset(vis, 0, sizeof vis); h = t = 0; que[t++] = dep[ans1.second] > dep[ans2.second] ? ans1.second : ans2.second; s1.clear(), s2.clear(); s1.insert(w[*que]); s2.insert(w[1]); for (; h ^ t; h++) for (int x = adj[que[h]]; x; x = nx[x]) if (!vis[x]) { s1.insert(w[x]); vis[que[t++] = x] = true; } h = t = 0; for (que[t++] = 1; h ^ t; h++) for (int x = adj[que[h]]; x; x = nx[x]) if (!vis[x]) { s2.insert(w[x]); vis[que[t++] = x] = true; } int ans = s1.size() + s2.size(); printf("%d\n", ans); //printf("%d %d %d %d\n", ans1.first, ans1.second, ans2.first, ans2.second); } return 0; }