【算法分析】
“链式前向星”就是“多单链表”,每条单链表基于“头插法”并用 e[]、ne[]、h[] 、val[] 等数组进行模拟创建。其中:
e[idx]:存储序号为 idx 的边的终点值
ne[idx]:存储序号为 idx 的边指向的边的序号(模拟链表指针)
h[a]:存储头结点 a 指向的边的序号
val[idx]:存储序号为 idx 的边的权值(可选)
【算法代码】
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int h[N],e[N<<1],ne[N<<1],idx;
int cnt[N]; //times that a node has been operated
void add(int a,int b) {
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int num) {
for(int i=h[u]; i!=-1; i=ne[i]) {
int j=e[i];
cnt[j]+=num;
dfs(j,cnt[j]);
}
}
int main() {
int n;
cin>>n;
memset(h,-1,sizeof h);
for(int i=2; i<=n; i++) {
int idx;
cin>>idx;
add(idx,i);
}
string s;
int q;
cin>>s>>q;
while(q--) {
int x;
cin>>x;
cnt[x]++;
}
dfs(1,cnt[1]);
for(int i=1; i<=n; i++) { //Even is white, odd is black.
if(cnt[i]%2==0) s[i-1]=='1'?cout<<1:cout<<0;
else s[i-1]=='1'?cout<<0:cout<<1;
}
return 0;
}
/*
in:
6
3 1 1 3 4
100101
3
1
3
2
out:
010000
*/