题意:给你两颗有根树,判定是否同构。

用了《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的更多相关文章

  1. 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 ...

  2. POJ1635 Subway tree systems ——(判断树的同构,树的最小表示法)

    给两棵有根树,判断是否同构.因为同构的树的最小表示法唯一,那么用最小表示法表示这两棵树,即可判断同构.顺便如果是无根树的话可以通过选出重心以后套用之前的方法. AC代码如下: #include < ...

  3. POJ1635:Subway tree systems

    链接:http://poj.org/problem?id=1635 填坑树同构 题目给出的是除根外的括号序列表示. 其实只要跟你说hash大家都能写得出来…… hash函数取个效果别太差的就行了吧 # ...

  4. poj 1635 Subway tree systems(树的最小表示)

    Subway tree systems POJ - 1635 题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树,深搜完之后问这两棵树是不是同一棵树 /* 在po ...

  5. 【POJ】【1635】Subway Tree Systems

    树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同 ...

  6. [POJ 1635] Subway tree systems (树哈希)

    题目链接:http://poj.org/problem?id=1635 题目大意:给你两棵树的dfs描述串,从根节点出发,0代表向深搜,1代表回溯. 我刚开始自己设计了哈希函数,不知道为什么有问题.. ...

  7. HDU 1954 Subway tree systems (树的最小表示法)

    题意:用一个字符串表示树,0代表向下走,1代表往回走,求两棵树是否同构. 分析:同构的树经过最小表示会转化成两个相等的串. 方法:递归寻找每一棵子树,将根节点相同的子树的字符串按字典序排列,递归回去即 ...

  8. POJ 1635 Subway tree systems (树的最小表示法)

    题意:一串01序列,从一个点开始,0表示去下一个点,1表示回到上一个点,最后回到起点,遍历这棵树时每条边当且仅当走2次(来回) 给出两串序列,判断是否是同一棵树的不同遍历方式 题解:我们把每一个节点下 ...

  9. POJ 1635 Subway tree systems 有根树的同构

    POJ 1635 题目很简单 给个3000节点以内的根确定的树 判断是否同构.用Hash解决,类似图的同构,不过效率更高. #include<iostream> #include<c ...

随机推荐

  1. VC连接access

    (1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...

  2. phpmywind调用方法大全

    头部文件调用 <?php require_once('header.php'); ?> 底部文件调用 <?php require_once('footer.php'); ?> ...

  3. OGG相关操作

    参数文件详解: 1)truncate ogg 进程: Manager进程:manager进程是配置在源端和目标端 Extract(抽取)进程:部署在源端,用于捕获数据表或者日志中的数据文件: Pump ...

  4. 分布式系统的负载均衡以及ngnix负载均衡的五种策略

    一般而言,有以下几种常见的负载均衡策略: 一.轮询. 特点:给每个请求标记一个序号,然后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景. 缺点:该策略将节点视为等同, ...

  5. 大数据系列之Kafka安装

    先简单说下安装kafka的流程..(可配置多个zookeeper,这篇文只说一个zookeeper场景) 1.环境配置:jdk1.7+ (LZ用的是jdk1.8) 2.资料准备:下载 kafka_2. ...

  6. Laravel 中自定义日志目录

    参考:https://laravel-china.org/articles/7125/custom-log-directory-in-laravel

  7. 【hdoj_1865】1sting(递推+大数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1865 本题的关键是找递推关系式,由题目,可知前几个序列的结果,序列长度为n=1,2,3,4,5的结果分别是 ...

  8. [Matlab]Upper Triangularization & Back Substitution代码

    用来做数值计算作业的代码,来自Numerical Methods Using Matlab (4th Edition) [John H. Mathews, Kurtis K. Fink],改了一下注释 ...

  9. 关于Web2.0概念的一篇小短文

    Web2.0程序设计的第一篇作业,写了就顺手放上来吧. 在互联网泡沫破裂数年后,Tim O'Reilly与John Battelle总结了互联网产业复兴过程中出现的一系列现象,在2004年举办的第一届 ...

  10. 刽子手游戏(UVa489)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...