/*
Codeforces Round #790 (Div. 4) 【G题】
https://codeforces.com/contest/1676/problem/G
重点:建立树的联系
给的数据 n=7 表示有7个节点 1 1 2 3 3 5 表示每个节点下面的根
i: 2 3 4 5 6 7
如何转换? 可以用vector<int> 开二维 存储 一维表示节点本身 二维表示子节点
1 2 3
2 4
3 5 6
4
5 7 转换成这样就可以了 可以接下来的DFS了
6
7
8
*/
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=4010;
struct node{
int sumW=0;
int sumB=0;
}sum[maxn];
vector<int> vec[maxn];
void dfs(int x)//深搜 记录每个节点的左右sumW sumB之和
{
for(int i=0;i<vec[x].size();i++)
{
int num=vec[x][i];
dfs(num);
sum[x].sumB+=sum[num].sumB;
sum[x].sumW+=sum[num].sumW;
}
}
int main()
{
int t;cin>>t;
while(t--)
{
for(int i=0;i<maxn;i++)
{
sum[i].sumB=sum[i].sumW=0;
vec[i].clear();
}//初始化
int n,num;cin>>n;
for(int i=2;i<=n;i++)
{
scanf("%d",&num);
vec[num].push_back(i);//建立树上的联系
}
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='W')
sum[i+1].sumW++;
else
sum[i+1].sumB++;
}
dfs(1);
int ans=0;
for(int i=1;i<=n;i++)
{
if(sum[i].sumB==sum[i].sumW)
ans++;
}
cout<<ans<<"\n";
}
return 0;
}
Codeforces Round #790 (Div. 4) 【G题】
最新推荐文章于 2024-05-30 20:15:33 发布