WA on #6求助
查看原帖
WA on #6求助
632131
Kevin911楼主2024/8/28 22:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10,maxm=2e6+10;
int n,rt;
char s[maxn];
int b[maxn],c1[maxm],c2[maxm],d[maxn],fa[maxn],sz[maxn],mx[maxn],ans[maxn];
bool vis[maxn];
vector<int> g[maxn],a1,a2;
int pop(int x)
{
	if(!x) return 0;
	return pop(x/2)+x%2;
}
void get(int u,int f,int tp)
{
	if(!tp) d[u]=d[f]+1;
	sz[u]=1,mx[u]=0;
	a1.push_back(u);
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==f||vis[v]) continue;
		get(v,u,tp);
		if(!tp) fa[v]=u;
		sz[u]+=sz[v];
		mx[u]=max(mx[u],sz[v]);
	}
}
void add(int x,int y,int z)
{
	if(!z) return;
	if(d[x]<d[y]) swap(x,y);
	ans[x]+=z,ans[fa[y]]-=z;
}
void dfs1(int u,int f)
{
	b[u]=b[f]^(1ll<<(s[u]-'a'));
	a1.push_back(u),a2.push_back(u);
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==f||vis[v]) continue;
		dfs1(v,u);
	}
}
void dfs2(int u,int f)
{
	b[u]=0;
	a2.clear();
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==f||vis[v]) continue;
		a1.clear();
		dfs1(v,u);
		for(int j=0;j<a1.size();j++)
		{
			int p=a1[j],w=c1[b[p]^(1ll<<(s[u]-'a'))];
			add(u,p,w);
			w=c2[b[p]];
			add(v,p,w);
			for(int k=0;k<20;k++)
			{
				w=c1[b[p]^(1ll<<(s[u]-'a'))^(1ll<<k)];
				add(u,p,w);
				w=c2[b[p]^(1ll<<k)];
				add(v,p,w);
			}
		}
		for(int j=0;j<a1.size();j++)
		{
			int p=a1[j];
			c1[b[p]]++,c2[b[p]^(1ll<<(s[u]-'a'))]++;
		}
	}
	for(int i=0;i<a2.size();i++)
	{
		int v=a2[i];
		if(pop(b[v]^(1ll<<(s[u]-'a')))<=1) add(u,v,2);
		c1[b[v]]=c2[b[v]^(1ll<<(s[u]-'a'))]=0;
	}
	a2.clear();
	for(int i=g[u].size()-1;i>=0;i--)
	{
		int v=g[u][i];
		if(v==f||vis[v]) continue;
		a1.clear();
		dfs1(v,u);
		for(int j=0;j<a1.size();j++)
		{
			int p=a1[j],w=c1[b[p]^(1ll<<(s[u]-'a'))];
			add(u,p,w);
			w=c2[b[p]];
			add(v,p,w);
			for(int k=0;k<20;k++)
			{
				w=c1[b[p]^(1ll<<(s[u]-'a'))^(1ll<<k)];
				add(u,p,w);
				w=c2[b[p]^(1ll<<k)];
				add(v,p,w);
			}
		}
		for(int j=0;j<a1.size();j++)
		{
			int p=a1[j];
			c1[b[p]]++,c2[b[p]^(1ll<<(s[u]-'a'))]++;
		}
	}
	for(int i=0;i<a2.size();i++)
	{
		int v=a2[i];
		c1[b[v]]=c2[b[v]^(1ll<<(s[u]-'a'))]=0;
	}
	vis[u]=1;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==f||vis[v]) continue;
		a1.clear();
		get(v,u,1);
		for(int j=0;j<a1.size();j++)
		{
			int p=a1[j];
			mx[p]=max(mx[p],sz[v]-sz[p]);
			if(mx[p]<=sz[v]/2) rt=p;
		}
		dfs2(rt,0);
	}
}
void dfs3(int u,int f)
{
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==f) continue;
		dfs3(v,u);
		ans[u]+=ans[v];
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u); 
	}
	cin>>s+1;
	a1.clear();
	get(1,0,0);
	for(int i=0;i<a1.size();i++)
	{
		int v=a1[i];
		mx[v]=max(mx[v],n-sz[v]);
		if(mx[v]<=n/2) rt=v;
	}
	dfs2(rt,0);
	dfs3(1,0);
	for(int i=1;i<=n;i++) cout<<ans[i]/2+1<<' ';
}
/*
6
1 2
2 3
3 4
4 5
4 6
abaaba
*/
2024/8/28 22:03
加载中...