ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树hash

2020-06-05 20:03:19  阅读:225  来源: 互联网

标签:used const int tot lb return hash


神仙的博客(我就是用的这种方法)

树hash的方法很多,我用的是上面博客里面的方法

最近跟Wendigo神仙做题目,发现自己思维不行

题目

BJOI2015树的同构

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod=998244341;
const int N=100000;
const int M=1299720;
struct edge
{
	int to,nxt;
}e[N*2];
int h[N],E=0;
ll f[N+5],g[N+5],siz[N];
int p[N+5],tot=0;
bitset<M+5> used;
vector<int> hs[N];
int n,m;
int vis[N];
void addedge(int u,int v)
{
	E++;
	e[E].to=v,e[E].nxt=h[u];
	h[u]=E;
	return;
}
void getsieve(int n)
{
	used[0]=used[1]=1;
	tot=0;
	for(int i=2;i<=n;i++)
	{
		if(!used[i]) p[++tot]=i;
		for(int j=1;j<=tot&&p[j]*i<=n;j++)
		{
			used[p[j]*i]=1;
			if(i%p[j]==0) break;
		}
	}
	return;
}
void dfs(int u,int fa)
{
	f[u]=1;
	siz[u]=1;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u);
		siz[u]+=siz[v];
		f[u]+=f[v]*p[siz[v]]%mod;
		f[u]%=mod;
	}
	return;
}
void dfs1(int u,int fa)
{
	g[u]=0;
	if(u!=1)
	{
		g[u]=(f[fa]-p[siz[u]]*f[u]%mod+mod)%mod;
		g[u]=(g[u]+g[fa]*p[n-siz[fa]]%mod)%mod;		
	}
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa) continue;
		dfs1(v,u);
	}
	return;
}
int cmp(vector<int> &a,vector<int> &b)
{
	int la=a.size(),lb=b.size();
	if(la!=lb) return 0;
	for(int i=0;i<la;i++) if(a[i]!=b[i]) return 0;
	return 1;
}
void insert(int tot)
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) h[i]=0;
	E=0;
	int fa;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&fa);
		if(!fa) continue;
		addedge(i,fa);
		addedge(fa,i);
	}
	dfs(1,0);
	dfs1(1,0);
	for(int i=1;i<=n;i++) hs[tot].push_back((g[i]*p[n-siz[i]]%mod+f[i])%mod);
	sort(hs[tot].begin(),hs[tot].end());
	return;
}
int main()
{
	getsieve(M);
	scanf("%d",&m);
	for(int i=1;i<=m;i++) insert(i);
	for(int i=1;i<=m;i++) vis[i]=i; 
	for(int i=1;i<=m;i++)	
	{
		for(int j=i+1;j<=m;j++)
		{
			if(cmp(hs[i],hs[j]))
			{
				vis[j]=min(vis[j],i);
			}
		}
	}
	for(int i=1;i<=m;i++) printf("%d\n",vis[i]);
	return 0;
}

标签:used,const,int,tot,lb,return,hash
来源: https://www.cnblogs.com/SegmentTree/p/13051673.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有