被卡常,遗憾离场
查看原帖
被卡常,遗憾离场
508032
int08楼主2024/8/19 17:20

用 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;
}
2024/8/19 17:20
加载中...