树hash啊

我的做法很垃圾,就是yy一种只有一个孩子时hash值和孩子一样的hash法

然后用重心去作为根遍历

这样有点问题,就是重心假如也是要删掉的那就gg了

那我们求tot的时候删掉的点就不管直接设为0,求重心的时候也不管这些删掉的点就可以了

其实

先把新的树建出来不好吗

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int _=1e2;
const int maxn=1e4+_;
const int maxt=+; const LL hbase=; LL mi[maxn];
void hyu(){mi[]=;for(int i=;i<maxn;i++)mi[i]=mi[i-]*hbase;} struct TREE
{
int id,ptt;
TREE(){ptt=;}
struct node
{
int x,y,next;
}a[*maxn];int len,last[maxn],du[maxn];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len; du[x]++;
if(du[x]==)ptt++;
else if(du[x]==)ptt--;
} //---------------------------------def-------------------------------------------- int tot[maxn];
void dfs(int x,int fr)
{
if(du[x]==)tot[x]=;
else tot[x]=;
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)dfs(a[k].y,x),tot[x]+=tot[a[k].y];
}
int G[maxn];
void getrt(int x,int fr)
{
G[x]=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
G[x]=max(G[x],tot[y]);
if(y!=fr)
{
tot[x]-=tot[y];
tot[y]+=tot[x];
getrt(y,x);
tot[y]-=tot[x];
tot[x]+=tot[y];
}
}
} //----------------------------------getrt-------------------------------------------- int num;LL THash[];
LL h[maxn]; int tlen; LL tt[maxn];
void gethash(int x,int fr)
{
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)gethash(a[k].y,x);
tlen=;
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)tt[++tlen]=h[a[k].y]; if(tlen==)h[x]=;
else
{
sort(tt+,tt+tlen+);
h[x]=(tlen-)*;
for(int i=;i<=tlen;i++)h[x]+=tt[i]*mi[i-];
}
} //---------------------------------gethash------------------------------------------- void main()
{
int n,x,y;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
ptt=n-ptt; dfs(,),getrt(,);
num=;
int mn=(<<);
for(int i=;i<=n;i++)
if(du[i]!=)mn=min(mn,G[i]);
for(int i=;i<=n;i++)
if(mn==G[i])
gethash(i,),THash[num++]=h[i];
}
}tr[maxt];
bool check(int x,int y)
{
for(int i=;i<tr[x].num;i++)
for(int j=;j<tr[y].num;j++)
if(tr[x].THash[i]==tr[y].THash[j])return true;
return false;
} int aslen,as[maxt];
bool cmp(int x,int y){return tr[x].ptt<tr[y].ptt;}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int m;
scanf("%d",&m);hyu();
for(int i=;i<=m;i++)
tr[i].id=i,tr[i].main();
for(int i=;i<=m;i++)
{
bool bk=false;
for(int j=;j<=aslen;j++)
if(check(i,as[j])){bk=true;break;}
if(!bk)as[++aslen]=i;
}
sort(as+,as+aslen+,cmp);
printf("%d\n",aslen);
for(int i=;i<aslen;i++)printf("%d ",tr[as[i]].ptt);
printf("%d\n",tr[as[aslen]].ptt); return ;
}

bzoj4474: [Jsoi2015]isomorphism的更多相关文章

  1. 【BZOJ4474】isomorphism(树的同构,哈希)

    题意:一个无向树的度数为 2的结点称为假结点,其它结点称为真结点.一个无向树的简化树其结点由原树的全体真结点组成,两个真结点之间有边当且仅当它们在原树中有边,或者在原树中有一条联结这两个结点的路,其中 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 「JSOI2015」isomorphism

    「JSOI2015」isomorphism 传送门 我们还是考虑树哈希来判同构. 但是我们需要使用一些特殊的手段来特殊对待假节点. 由于是无向树,我们首先求出重心,然后以重心为根跑树哈希. 此处我们不 ...

  4. JSOI2015 Round1——完挂

    感觉眼前天地转了转…… Day 0 和zxy,zyh一同坐车去扬中,同行的还有llr 路上zyh基本在睡觉…… 入住的宾馆各种坑爹,同一层住的两个房间一个有网一个没网 我有幸入住了有网的房间,zyh在 ...

  5. BZOJ1478 Sgu282 Isomorphism

    Problem A: Sgu282 Isomorphism Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 88[Submit] ...

  6. bzoj4487[Jsoi2015]染色问题 容斥+组合

    4487: [Jsoi2015]染色问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 127[Submit][Status ...

  7. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  8. Isomorphism 同构

    小结: 1.两个有限维度的向量空间,在同一数域下,是同构的 等价于 它们维数相等. Isomorphism 同构 0.1.8 Isomorphism. If U and V are vector sp ...

  9. 【BZOJ4477】[JSOI2015]字符串树(Trie树)

    [BZOJ4477][JSOI2015]字符串树(Trie树) 题面 BZOJ 题解 对于每个点维护其到根节点的所有字符串构成的\(Trie\),显然可持久化一下就很好写了. 然后每次询问就是\(u+ ...

随机推荐

  1. Wannafly挑战赛2 D.Delete(拓扑排序 + dij预处理 + 线段树维护最小值)

    题目链接  D.Delete 考虑到原图是个DAG,于是我们可以求出每个点的拓扑序. 然后预处理出起点到每个点的最短路$ds[u]$, 和所有边反向之后从终点出发到每个点的最短路$dt[u]$. 令点 ...

  2. k8s之存储卷及pvc

    1.存储卷概述 因为pod是有生命周期的,pod一重启,里面的数据就没了,所以我们需要数据持久化存储,在k8s中,存储卷不属于容器,而是属于pod,也就是说同一个pod中的容器可以共享一个存储卷,存储 ...

  3. chpasswd、dd命令、find实战、添加系统服务、buffer、cached

    1.如果两个文件的每一行想一一对应 paste 1.txt 2.txt # 文件3.txt中存放着用户跟密码,想要添加用户并设置密码: # 用户必须存在,文件格式必须是--用户名:密码 chpassw ...

  4. BZOJ题目(持续更新)

    bzoj1009:kmp想法+递推+矩阵快速幂.很好的想法,考虑用长串去kmp匹配短串,dp[i][j]表示匹配指针分别指在i.j位置时候,前i位母字符串一共有多少种可能性,那么dp[i][j]=Σd ...

  5. Java中String/StringBuffer/StringBuilder区别(转)

    1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuild ...

  6. ArcGIS 安装中,SQL的使用出现错误的解决

    1. SQL Server Configuration Manager 中 SQL Server Services出现 “远程调用失败..” 的问题 解决方法是卸载

  7. 终极报错解决方案:Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed with

    遇到这个报错的时候,不要慌 Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger fail ...

  8. iOS开发之分段控制器(UISegmentedControl)

    今天我们来说下iOS中的分段选择控制器UISegmentedControl,这一控件有什么作用呢 每个segment都能被点击,相当于集成了多个button 通常我们会点击不同的segment来切换不 ...

  9. 转: MySQL索引原理及慢查询优化 (from 美团技术博客)

    转: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色, ...

  10. .Net 平台WebService的创建、部署和使用介绍

    .NET平台内建了对Web Service的支持,包括Web Service的构建和使用.与其它开发平台不同,使用.NET平台,你不需要其他的工具或者SDK就可以完成Web Service的开发了.. ...