这题理论上值域相关的数组最大要开多少啊,为啥我开到8e6都过不了,最后开到 2e7才过。
#include <iostream>
#include <cstdio>
using std::max;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=2e6+5;
int to[N],nxt[N],val[N],head[N],cnt=1;
int L[N],R[N],siz[N],son[N],tim,n;
int t[N*10],b[N],id[N],ans[N],dep[N];
//上面的
void Edge_add(int u,int v,int w){
to[cnt]=v,nxt[cnt]=head[u],val[cnt]=w,head[u]=cnt++;
}
void Dfs1(int u){
siz[u]=1,L[u]=++tim,id[tim]=u;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];b[v]=b[u]^(1<<val[i]);
dep[v]=dep[u]+1,Dfs1(v),siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
R[u]=tim;
}
void Dfs(int u,int op){
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v!=son[u])Dfs(v,0);
}
if(son[u])Dfs(son[u],1);
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==son[u])continue;
for(int j=L[v];j<=R[v];j++){
int x=id[j];
for(int k=0;k<=22;k++){
int z=(1<<k)^b[x];
if(!t[z])continue;
ans[u]=max(ans[u],t[z]+dep[x]-2*dep[u]);
}
if(t[b[x]])ans[u]=max(ans[u],t[b[x]]+dep[x]-2*dep[u]);
}
for(int j=L[v];j<=R[v];j++){
t[b[id[j]]]=max(t[b[id[j]]],dep[id[j]]);
}
}
for(int i=head[u];i;i=nxt[i])ans[u]=max(ans[u],ans[to[i]]);
for(int i=0;i<=22;i++){
if(!t[b[u]^(1<<i)])continue;
ans[u]=max(ans[u],t[b[u]^(1<<i)]-dep[u]);
}
if(t[b[u]])ans[u]=max(ans[u],t[b[u]]-dep[u]);
t[b[u]]=max(t[b[u]],dep[u]);
if(!op){
for(int i=L[u];i<=R[u];i++)t[b[id[i]]]=0;
}
}
int main(){
n=read();
for(int i=2,f,w;i<=n;i++){
f=read();char ch;std::cin>>ch;w=ch-'a';
Edge_add(f,i,w);
}
Dfs1(1);
Dfs(1,0);
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
return 0;
}