WA #6 求助
查看原帖
WA #6 求助
530797
code_hyx楼主2023/2/23 19:29
#include<bits/stdc++.h>
using namespace std;
int n,m;
int h[1000005],to[1000005],nxt[1000005],cnt=0,ct=0;
string s;
void add(int x,int y)
{
	to[++cnt]=y;
	nxt[cnt]=h[x];
	h[x]=cnt;
}
long long ans[1000005],ap[1000005],maxx=0,sum=0,k;
int sz[1000005],son[1000005],col[1000005],tot[1000005][30],vis[1000005],heason[1000005],d[1000005],f[1000005];
struct node
{
	int id;
	int num;
};
vector<node> q[1000005];
bool check(int s[])
{
	int res=0;
	for(int i=1;i<=26;i++)res+=(s[i]&1);
	if(res<=1)return true;
	else return false;
}
void dfs1(int x,int fa)
{
    sz[x]=1;
    d[x]=d[fa]+1;
    for(int i=h[x];i;i=nxt[i])
	{
		int y=to[i];
        if(y==fa)continue;
        dfs1(y,x);
        sz[x]+=sz[y];
        if(heason[x]==0||sz[heason[x]]<sz[y])
        {
        	heason[x]=y;
		}
    }
}
void dfs2(int x,int fa,int c)
{
    tot[d[x]][s[x]-'a'+1]+=c;
    for(int i=h[x];i;i=nxt[i])
	{
		int y=to[i];
        if(y==fa||vis[y])continue;
        dfs2(y,x,c);
    }
}
void dfs3(int x,int fa,bool bj)
{
    for(int i=h[x];i;i=nxt[i])
	{
		int y=to[i];
        if(y==fa||y==heason[x])continue;
        dfs3(y,x,1);
    }
    if(heason[x])
    {
    	dfs3(heason[x],x,0);
		vis[heason[x]]=1;
	}
    dfs2(x,fa,1);
    for(int i=0;i<q[x].size();i++)
	{
		ans[q[x][i].id]=check(tot[q[x][i].num]);
	}
	if(heason[x])vis[heason[x]]=1;
    if(bj)dfs2(x,fa,-1);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=2;i<=n;i++)
	{
		int x;
		cin>>x;
		add(x,i);
		add(i,x);
	}
	cin>>s;
	s=" "+s;
	for(int i=1;i<=m;i++)
	{             
		int u;    
		cin>>u>>k;
		q[u].push_back((node){i,k});
	}
	dfs1(1,0);
	dfs3(1,0,1);
	for(int i=1;i<=m;i++)
	{             
		if(ans[i]==1)cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}
/*
5 6
1 1 2 3
cbcab
3 1
5 2
1 3
4 1
4 2
1 1
*/
2023/2/23 19:29
加载中...