【树哈希】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 ...
随机推荐
- 使用infinite-scroll实现Ghost博文列表的滚动加载
Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...
- MQTT协议及推送服务(二)
MQTT简介 MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议.由于其维护一个长连接以轻量级低消耗著称,所以 ...
- Coursera在线学习---第四节.过拟合问题
一.解决过拟合问题方法 1)减少特征数量 --人为筛选 --靠模型筛选 2)正则化(Regularization) 原理:可以降低参数Θ的数量级,使一些Θ值变得非常之小.这样的目的既能保证足够的特征变 ...
- apache2启动失败(Failed to start The Apache HTTP Server.)解决方案
不知道如何启动apache2就启动不来了. 如下图所示: 即使卸载了重新装也是如此 经过测试卸载并清除软件包的配置即可解决 sudo apt-get purge apache2 sudo apt-g ...
- Mac Sublime Vim模式 方向键无法长按
终端输入 sublime2: defaults write com.sublimetext.2 ApplePressAndHoldEnabled -bool false sublime3: defau ...
- MySQL-索引工作原理及使用注意事项
1.为什么需要索引(Why is it needed)? 当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表 ...
- Swift中的指针类型
Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...
- Mac 终端自动补全忽略大小写
打开终端,输入:nano .inputrc 在里面粘贴上以下语句: set completion-ignore-case onset show-all-if-ambiguous onTAB: menu ...
- ios 不支持iframe 解决方案
在iframe外层在包一层,通过appendChild()把内容增加到容器中,完整代码如下: @section Css { <link href="@ViewHelper.Conten ...
- gan对抗式网络
感觉好厉害,由上图噪声,生成左图噪声生成右图以假乱真的图片, gan网络原理: 本弱又盗了一坨博文,不是我写的,如下:(跪膜各路大神) 前面我们已经讲完了一般的深层网络,适用于图像的卷积神经网络,适用 ...