样例 RE 求条
查看原帖
样例 RE 求条
661984
Stone_Xz楼主2024/10/13 17:08
#include<bits/stdc++.h>
using namespace std;

const int N = 5e5 + 5;

int n, m, heavy; 

int siz[N], son[N], c[N], fa[N], sum[N][30], dep[N], SON[N];

bool ans[N];

char s[N];

vector<int> nbr[N];

struct Query {
	int id, b;
};
vector<Query> q[N];

bool check(int x)
{
	int cnt = 0;
	for(int i = 0; i < 26; i++)
		cnt += (sum[x][i] & 1);
	return cnt <= 1;
}

void pre_son(int cur, int fa)
{
	dep[cur] = dep[fa] + 1;
	siz[cur] = 1;
	for(auto nxt : nbr[cur]) if(nxt != fa)
	{
		pre_son(nxt, cur);
		siz[cur] += siz[nxt];
		if(siz[nxt] > siz[son[cur]])
			son[cur] = SON[cur] = nxt;
	}
	
}

void update(int cur, int fa, int val)
{
	sum[dep[cur]][s[cur] - 'a'] += val;
	for(auto nxt : nbr[cur]) if(nxt != fa)
	{
		if(nxt == heavy) continue;
		update(nxt, cur, val);
	}
}

void dfs(int cur, int fa, bool big)
{
	for(auto nxt : nbr[cur]) if(nxt != fa)
	{
		if(nxt == son[cur]) continue;
		dfs(nxt, cur, 0);
	}
	if(son[cur])
	{
		dfs(son[cur], cur, 1);
		heavy = son[cur];
	}
	update(cur, fa, 1);
	for(auto Q : q[cur])
		ans[Q.id] = check(Q.b);
	heavy = 0;
	if(!big) update(cur, fa, -1);
}

int main()
{
	cin.tie(0) -> sync_with_stdio(0);
	cin >> n >> m;
	for(int i = 1; i < n; i++)
	{
		int u = i, v; cin >> v;
		nbr[u].push_back(v);
		nbr[v].push_back(u);
	}
	for(int i = 1; i <= n; i++)
		cin >> s[i];
	for(int i = 1; i <= m; i++)
	{
		int a, b; cin >> a >> b;
		q[a].push_back((Query){i, b});
	}
	pre_son(1, 0);
	dfs(1, 0, 0);
	for(int i = 1; i <= m; i++)
		cout << (ans[i] == false ? "No" : "Yes") << "\n";
	return 0;
}
2024/10/13 17:08
加载中...