要似了,,
查看原帖
要似了,,
246331
mystic_qwq楼主2024/10/1 15:48

RT,看起来没有丝毫的问题a,样例过不去

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define IO ios::sync_with_stdio(0),cin.tie(NULL)
const int N=5e5+10;
int n,q,siz[N],son[N],cnt[N][26],top,vis[N],sum[N],dep[N],Res[N];
vector<int> G[N];
char s[N];
void dfs(int u){
  siz[u]=1;
  for(int v:G[u]) {
    dep[v]=dep[u]+1;
    dfs(v);
    siz[u]+=siz[v];
    if(!son[u]||siz[v]>siz[son[u]])
      son[u]=v;
  }
}
void calc(int u,int val){
  cnt[dep[u]][s[u]-'a']+=val;
  //if(cnt[dep[u]][s[u]-'a']&1) ++Res[dep[u]];
  //else --Res[dep[u]];
  for(int v:G[u])
    if(!vis[v]) calc(v,val);
}
struct Qry {
  int dep,id;
};
bool ans[N];
vector<Qry> qq[N];
bool check(int num[]){
  int ret=0;
  for(int i=0;i<26;++i){
    //printf("%d ",num[i]);
    if(num[i]&1) ++ret;
    if(ret>1) return 0;
  }
  //puts("");
  if(ret>1) return 0;
  return 1;
}
void dfs2(int u,int keep){
  for(int v:G[u])
    if(v!=son[u])
      dfs2(v,0);
  if(son[u]){ 
    dfs2(son[u],1);
    vis[son[u]]=1;
  }
  calc(u,1);
  vis[son[u]]=0;
  for(auto[d,id]:qq[u])
    ans[id]=check(cnt[d]);//Res[d]<=1;
  if(!keep) 
    calc(u,-1);
}
signed main(){
  cin>>n>>q;
  for(int i=1;i<n;++i){
    int p;
    cin>>p;
    G[p].push_back(i+1);
  }
  cin>>s+1,dfs(1);
  for(int i=1;i<=q;++i){
    int x,de; 
    scanf("%d%d",&x,&de);
    qq[x].push_back((Qry){de,i});
  }
  dfs2(1,0);
  for(int i=1;i<=q;++i) 
    puts(ans[i]?"Yes":"No");
}
2024/10/1 15:48
加载中...