#include<bits/stdc++.h>
#define N 700005
using namespace std;
int n,m;
int head[N],idx,w[N];
int siz[N],son[N],dep[N],MAX_DEP;
int tot,root[N],cnt;
bool vis[N],ans[N];
map<string,int> ma;
set<int> t[N];
struct query{
int k,id;
};
struct edge{
int v,next;
}e[N<<1];
vector<query> q[N];
void add(int u,int v){
e[++idx].v=v;
e[idx].next=head[u];
head[u]=idx;
}
void dfs1(int x,int f){
siz[x]=1;
dep[x]=dep[f]+1;
MAX_DEP=max(dep[x],MAX_DEP);
for(int i=head[x];i;i=e[i].next){
int y=e[i].v;
if(y==f) continue;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]]) son[x]=y;
}
}
void solve(int x,int f){
t[dep[x]].insert(w[x]);
for(int i=head[x];i;i=e[i].next){
int y=e[i].v;
if(vis[y]||y==f) continue;
solve(y,x);
}
}
void dfs2(int x,int f,int type){
for(int i=head[x];i;i=e[i].next){
int y=e[i].v;
if(y==f||y==son[x]) continue;
dfs2(y,x,1);
}
if(son[x]){
dfs2(son[x],x,0);
vis[son[x]]=1;
}
solve(x,f);
// cout<<x<<": ";
// for(int i=1;i<=MAX_DEP;i++){
// cout<<i<<' '<<t[i].size()<<"; ";
// }
// cout<<endl;
for(int i=0;i<q[x].size();i++){
int tmp=dep[x]+q[x][i].k;
if(tmp>MAX_DEP) ans[q[x][i].id]=0;
else{
ans[q[x][i].id]=t[tmp].size();
cout<<q[x][i].id<<' '<<tmp<<' '<<t[tmp].size()<<' '<<ans[q[x][i].id]<<endl;
}
}
if(son[x]) vis[son[x]]=0;
if(type)
for(int i=1;i<=MAX_DEP;i++) t[i].clear();
}
int main(){
scanf("%d",&n);
string s;
for(int i=1;i<=n;i++){
int f;
cin>>s;
scanf("%d",&f);
if(f)add(f,i),add(i,f);
else root[++cnt]=i;
if(!ma[s]) ma[s]=++tot;
w[i]=ma[s];
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int u;
query x;
scanf("%d%d",&u,&x.k);
x.id=i;
q[u].push_back(x);
}
for(int i=1;i<=cnt;i++) dfs1(root[i],0);
for(int i=1;i<=cnt;i++) dfs2(root[i],0,1);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
我在debug时输出
ans[q[x][i].id]=t[tmp].size();
cout<<q[x][i].id<<' '<<tmp<<' '<<t[tmp].size()<<' '<<ans[q[x][i].id]<<endl;
但是这几行的输出却是
就是t[tmp].size()与ans[q[x][i].id]不同
可是我刚刚才赋过值呀