BZOJ 4598: [Sdoi2016]模式字符串

题意:一棵树点上有字符,给定模式字符串,求树上两点间路径形成字符串为模式字符串重复整数次得到的点对个数

Sol:

显然的点分治,判断可以将模式字符串的正反版本补齐到n后Hash,对当前重心的每个儿子dfs时记录路径Hash值与之前的配对即可,注意自己与自己的配对关系

时间复杂度O(nlogn)

这种代码题我竟然1A了233真是感动

Code:

#include
#define debug(x) cout<<#x<<"="<'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void add_edg(int x,int y)
{
	e_sum++;
	e[e_sum].next=first[x];
	first[x]=e_sum;
	e[e_sum].to=y;
}

void ClearLove()
{
	memset(vis,0,sizeof vis);memset(first,0,sizeof first);
	e_sum=0;ans=0;
}

void find(int x,int f)
{
	W[x]=0;siz[x]=1;
	for(int i=first[x];i;i=e[i].next)
	{
		int w=e[i].to;
		if(vis[w]||w==f) continue;
		find(w,x);
		siz[x]+=siz[w];
		W[x]=max(W[x],siz[w]);
	}W[x]=max(W[x],sum-siz[x]);
	if(W[x]


你可能感兴趣的:(学术相关)