比较常规的套路,是我做的第二道模板题
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; const int N=1e6+10; const int M=2e6+10; const int inf=0x3f3f3f3f; const ll mod=998244353; int ans[N]; int h[N],ne[N],e[N],idx; int cnt[N][27]; int son[N],sz[N]; int flag; int depth[N]; int w[N]; struct node{ int id,d; }; vector<node> s[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs1(int u,int fa){ int i; sz[u]=1; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa) continue; depth[j]=depth[u]+1; dfs1(j,u); sz[u]+=sz[j]; if(sz[j]>sz[son[u]]){ son[u]=j; } } } void cal(int u,int fa,int k){ cnt[depth[u]][w[u]]+=k; int i; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa||j==flag) continue; cal(j,u,k); } } bool check(int d){ int i; int res=0; for(i=0;i<26;i++){ res+=(cnt[d][i]%2); } return res<=1; } void dfs(int u,int fa,int keep){ int i; for(i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(j==fa||j==son[u]) continue; dfs(j,u,0); } if(son[u]){ dfs(son[u],u,1); flag=son[u]; } cal(u,fa,1); flag=0; for(auto x:s[u]){ int a=x.id; int b=x.d; ans[a]=check(b); } if(!keep){ cal(u,fa,-1); } } int main(){ ios::sync_with_stdio(false); memset(h,-1,sizeof h); int n,m; cin>>n>>m; int i; for(i=2;i<=n;i++){ int x; cin>>x; add(i,x); add(x,i); } depth[1]=1; dfs1(1,-1); for(i=1;i<=n;i++){ char c; cin>>c; w[i]=c-'a'; } for(i=1;i<=m;i++){ int x,y; cin>>x>>y; s[x].push_back({i,y}); } dfs(1,-1,0); for(i=1;i<=m;i++){ if(ans[i]){ cout<<"Yes "; } else{ cout<<"No "; } } return 0; }