【树哈希】poj1635 Subway tree systems
题意:给你两颗有根树,判定是否同构。
用了《Hash在信息学竞赛中的一类应用》中的哈希函数。
len就是某结点的子树大小,g是某结点的孩子数+1。
这个值也是可以动态转移的!具体见论文,所以能高速处理出一颗无根树以每个顶点为根时的哈希值。改日敲个板子试试。
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
typedef vector<int>::iterator ITER;
vector<int>G[2][3005];
const ull base=3001ll;
ull bs[3005],f[2][3005];
int T,n,n2,fa[3005],fa2[3005],siz[2][3005];
char a[3005],b[3005];
void df1(int op,int U){
siz[op][U]=1;
for(ITER it=G[op][U].begin();it!=G[op][U].end();++it){
df1(op,*it);
siz[op][U]+=siz[op][*it];
}
}
bool cm0(const int &a,const int &b){
return f[0][a]<f[0][b];
}
bool cm1(const int &a,const int &b){
return f[1][a]<f[1][b];
}
void dfs(int op,int U){
f[op][U]=(ull)(G[op][U].size()+1)*bs[siz[op][U]-1];
for(ITER it=G[op][U].begin();it!=G[op][U].end();++it){
dfs(op,*it);
}
if(op==0){
sort(G[op][U].begin(),G[op][U].end(),cm0);
}
else{
sort(G[op][U].begin(),G[op][U].end(),cm1);
}
int now=0;
for(ITER it=G[op][U].begin();it!=G[op][U].end();++it){
f[op][U]+=f[op][*it]*bs[now];
now+=siz[op][*it];
}
}
int main(){
bs[0]=1;
for(int i=1;i<=3000;++i){
bs[i]=bs[i-1]*base;
}
scanf("%d",&T);
for(;T;--T){
memset(fa,0,sizeof(fa));
memset(fa2,0,sizeof(fa2));
memset(f,0,sizeof(f));
memset(siz,0,sizeof(siz));
for(int i=1;i<=n;++i){
G[0][i].clear();
}
for(int i=1;i<=n2;++i){
G[1][i].clear();
}
n=n2=1;
scanf("%s%s",a+1,b+1);
int len=strlen(a+1);
int U=1;
for(int i=1;i<=len;++i){
if(a[i]=='0'){
G[0][U].push_back(++n);
fa[n]=U;
U=n;
}
else{
U=fa[U];
}
}
U=1;
for(int i=1;i<=len;++i){
if(b[i]=='0'){
G[1][U].push_back(++n2);
fa2[n2]=U;
U=n2;
}
else{
U=fa2[U];
}
}
if(n!=n2){
puts("different");
continue;
}
for(int i=0;i<2;++i){
df1(i,1);
dfs(i,1);
}
puts(f[0][1]==f[1][1] ? "same" : "different");
}
return 0;
}
【树哈希】poj1635 Subway tree systems的更多相关文章
- poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法
Description Some major cities have subway systems in the form of a tree, i.e. between any pair of st ...
- POJ1635 Subway tree systems ——(判断树的同构,树的最小表示法)
给两棵有根树,判断是否同构.因为同构的树的最小表示法唯一,那么用最小表示法表示这两棵树,即可判断同构.顺便如果是无根树的话可以通过选出重心以后套用之前的方法. AC代码如下: #include < ...
- POJ1635:Subway tree systems
链接:http://poj.org/problem?id=1635 填坑树同构 题目给出的是除根外的括号序列表示. 其实只要跟你说hash大家都能写得出来…… hash函数取个效果别太差的就行了吧 # ...
- poj 1635 Subway tree systems(树的最小表示)
Subway tree systems POJ - 1635 题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树,深搜完之后问这两棵树是不是同一棵树 /* 在po ...
- 【POJ】【1635】Subway Tree Systems
树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...
- [POJ 1635] Subway tree systems (树哈希)
题目链接:http://poj.org/problem?id=1635 题目大意:给你两棵树的dfs描述串,从根节点出发,0代表向深搜,1代表回溯. 我刚开始自己设计了哈希函数,不知道为什么有问题.. ...
- HDU 1954 Subway tree systems (树的最小表示法)
题意:用一个字符串表示树,0代表向下走,1代表往回走,求两棵树是否同构. 分析:同构的树经过最小表示会转化成两个相等的串. 方法:递归寻找每一棵子树,将根节点相同的子树的字符串按字典序排列,递归回去即 ...
- POJ 1635 Subway tree systems (树的最小表示法)
题意:一串01序列,从一个点开始,0表示去下一个点,1表示回到上一个点,最后回到起点,遍历这棵树时每条边当且仅当走2次(来回) 给出两串序列,判断是否是同一棵树的不同遍历方式 题解:我们把每一个节点下 ...
- POJ 1635 Subway tree systems 有根树的同构
POJ 1635 题目很简单 给个3000节点以内的根确定的树 判断是否同构.用Hash解决,类似图的同构,不过效率更高. #include<iostream> #include<c ...
随机推荐
- 用create-react-app来快速配置react
最近在学react,然后感觉自己之前用的express+gulp+webpack+ejs的工作环境还是基于html+js+css这种三层架构的应用,完全跟react不是一回事. 愚蠢的我居然在原先的这 ...
- okhttp3使用详解
http://blog.csdn.net/itachi85/article/details/51190687
- 购物车中的input输入框只能输入数字和输入为0的时候默认为1
<input type="text" value="1" onkeyup="value=(parseInt((value=value.repla ...
- numpy 简介
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 【swupdate文档 五】从可信的来源更新镜像
从可信的来源更新镜像 现在越来越重要的是,设备不仅要能安全地进行更新操作, 而且要能够验证发送的图像是否来自一个已知的源, 并且没有嵌入恶意软件. 为了实现这个目标,SWUpdate必须验证传入的镜像 ...
- linux内核数据结构之链表【转】
转自:http://www.cnblogs.com/Anker/p/3475643.html 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结 ...
- LNMP结合discuz的配置
一.安装discuz 配置参照LAMP结合discuz的第一部分 不要忘记了 添加hosts~!!!! ===============我是分割线.========================== ...
- golang-goroutine和channel
goroutine 在go语言中,每一个并发的执行单元叫做一个goroutine 这里说到并发,所以先解释一下并发和并行的概念: 并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个 ...
- golang类型转换小总结
1. int <--> string 1.1. int --> string str := strconv.Itoa(intVal) 当然,整数转换成字符串还有其他方法,比如 fmt ...
- hdu 5920(模拟)
Ugly Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...