【BZOJ4754】独特的树叶(哈希)

题面

BZOJ

给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\)

求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构

题解

树哈希

一个奇怪的姿势

总而言之,就是把树的各种信息乱七八糟的拼在一起强行哈希一下

真搞不懂这种丧病的东西为什么还能直接出成省选题,

随便一个模数还可能\(WA\)。。。

这种东西依我看只适合\(IOI\)赛制

至于怎么搞?想怎么搞怎么搞啊。。。。

你可以把子树的哈希值排序再哈希

也可以直接异或起来(这个很不错)

甚至还可以像菊开那样直接跑快速幂

反正想怎么玩怎么玩。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
#define ull unsigned long long
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt,size[MAX],n;
void Add(int u,int v){e[++cnt]=(Line){v,h[u]};h[u]=cnt;}
ull hash[MAX];
set<ull> M;
const ull base1=1702;
const ull base3=998244353;
const ull base2=1000000007;
int ans=1e9;
int deg[MAX];
void dfs(int u,int ff)
{
hash[u]=0;size[u]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs(v,u);size[u]+=size[v];
hash[u]^=hash[v]+base1;
}
hash[u]+=base2*size[u]+base3;
}
void Calc(int u,int ff)
{
M.insert(hash[u]);
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-size[v])+base3;
hash[v]=((hash[v]-base2*size[v]-base3)^(tmp+base1))+base2*n+base3;
Calc(v,u);
}
}
void Calc2(int u,int ff)
{
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
if(deg[v]>1)
{
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-size[v])+base3;
hash[v]=((hash[v]-base2*size[v]-base3)^(tmp+base1))+base2*n+base3;
Calc2(v,u);
}
else
{
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-1)+base3;
if(M.count(tmp))
ans=min(ans,v);
}
}
}
int main()
{
n=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
dfs(1,0);Calc(1,0);
memset(h,0,sizeof(h));cnt=0;
for(int i=1;i<=n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
++deg[u];++deg[v];
}
for(int i=1;i<=n;++i)
if(deg[i]>1)
{
++n;dfs(i,0);Calc2(i,0);
break;
}
printf("%d\n",ans);
return 0;
}

【BZOJ4754】独特的树叶(哈希)的更多相关文章

  1. BZOJ4754 JSOI2016独特的树叶(哈希)

    判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...

  2. BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构

    题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...

  3. bzoj4754[JSOI2016]独特的树叶

    这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...

  4. BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...

  5. P4323 [JSOI2016]独特的树叶(树哈希)

    传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...

  6. P4323-[JSOI2016]独特的树叶【换根dp,树哈希】

    正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出\(n\)个点的树和加上一个点之后的树(编号打乱). 求多出来的是哪个点(如果有多少个就输出 ...

  7. Luogu 4323 [JSOI2016]独特的树叶

    新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...

  8. [JSOI2016]独特的树叶

    https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \ ...

  9. Luogu P4323 [JSOI2016]独特的树叶

    一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构) ...

随机推荐

  1. Azkaban 工作流调度器

    Azkaban 工作流调度器 1 概述 1.1 为什么需要工作流调度系统 a)一个完整的数据分析系统通常都是由大量任务单元组成,shell脚本程序,java程序,mapreduce程序.hive脚本等 ...

  2. jenkins统计单元测试的覆盖率

    前提:单元测试和被测代码在一个仓库 maven的pom配置 依赖增加 <dependency> <groupId>org.jacoco</groupId> < ...

  3. Vue.js之常用指令

    vue常用指令 vue.js官方给自己的定义是数据模板引擎,并给出了一套渲染数据的指令.本文详细介绍vue.js的常用指令. 官网:点我 一.v-text.v-html v-text:用于绑定文本 v ...

  4. python 的入门

    时光匆匆,大一的时间过的很快,从大一上学期学的c开始,就感觉出c的结构很复杂,但是不可否认,学习c和汇编等涉及到系统底层知识才会有可能开发出属于自己知识产权的东西,然而,python以其简约性,丰富的 ...

  5. Java EE平台介绍(译)

    Java EE平台介绍 2.1 企业应用总览 这一部分将对企业应用及其设计和开发进行简单介绍. 就像之前说的,Java EE 平台是为了帮助开发者开发大规模.多层次.可伸缩.服务可靠.网络安全的应用而 ...

  6. Vue 项目在其他电脑 npm run dev 运行报错的解决方法

    一个 Vue 项目从一台电脑上传到 github 上之后,再另外一台电脑上 git clone .并使用 npm run dev 或 npm run start 发生以下报错的解决方法.   报错原因 ...

  7. Codeforces Round #765 Div.1 F. Souvenirs 线段树

    题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...

  8. 03慕课网《进击Node.js基础(一)》API-URL网址解析

    url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...

  9. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  10. 运维学习笔记(七)之T02-01计算机网络 、 数制 、 网络通信参考模型

    计算机网络 计算机网络概述 什么是计算机网络 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统.应用软件.应用程序通过通信线路互连 实现资源共享.信息传递 功能 数据通信/资源共享/增 ...