用 unordered_map 直接启发式合并,被 12 号点卡爆了。
队友呢,救一下啊
(还是说我复杂度假了)
#include<bits/stdc++.h>
using namespace std;
#define N 508032
int a[N],d[N],cut[N];
vector<int> e[N];
unordered_map<int,int> m[N];
int anf[25],ans[N];
int n,u,v,i;char op;
void merge(int u,int v)
{
if(m[u].size()<m[v].size()) swap(m[u],m[v]);
for(int i=0;i<=22;i++) for(auto x:m[v]) if(m[u].find(x.first^anf[i])!=m[u].end()) ans[u]=max(ans[u],x.second+m[u][x.first^anf[i]]-2*d[u]);
for(auto x:m[v]) m[u][x.first]=max(m[u][x.first],x.second);
}
void dfs(int u,int fa)
{
m[u][a[u]]=d[u];
for(auto v:e[u]) if(fa!=v)
{
a[v]^=a[u];d[v]=d[u]+1;
dfs(v,u);
ans[u]=max(ans[u],ans[v]);
merge(u,v);
}
}
int main()
{
cin>>n;
for(i=1;i<=22;i++) anf[i]=1<<(i-1);
for(i=2;i<=n;i++) cin>>u>>op,e[u].push_back(i),a[i]=(1<<(op-'a'));
dfs(1,0);
for(i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}