萌新求助
查看原帖
萌新求助
174897
zjrdmd楼主2022/1/12 09:46

这题理论上值域相关的数组最大要开多少啊,为啥我开到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;
}
2022/1/12 09:46
加载中...