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

用了《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. session_write_close()的作用

    简单地说,当开启session_start以后,这个session会一直开启,并且被一个用户使用.其他用户开启session的话要等待第一个session用户关闭以后才可以开启sessio,这样就造成 ...

  2. bzoj 2303 并查集

    首先如果没有限制的话,我们可以直接求出答案,假设对于n*m的矩阵,我们最上方一行和左方的一列随意确定,那么首先这写确定的状态肯定是不会不合法的,因为我们可以调整剩下的01状态来使得这一行一列的状态合法 ...

  3. 6 - Python内置结构 - 字典

    目录 1 字典介绍 2 字典的基本操作 2.1 字典的定义 2.2 字典元素的访问 2.3 字典的增删改 3 字典遍历 3.1 遍历字典的key 3.2 遍历字典的value 3.3 变量字典的键值对 ...

  4. Java Eclipse 配置

    1.清除多余记录 最近用eclipse打包jar的时候,需要指定一个main函数.需要先运行一下main函数,eclipse的Runnable JAR File Specification 下的Lau ...

  5. C++ 模版的优点和缺点

    优点: 1. 灵活性, 可重用性和可扩展性; 2. 可以大大减少开发时间,模板可以把用同一个算法去适用于不同类型数据,在编译时确定具体的数据类型; 3. 模版模拟多态要比C++类继承实现多态效率要高, ...

  6. falsk注册etcd

    部署web服务集群时,我们希望能动态调整集群大小.当一个新的节点启动时,可以将自己的信息注册给master, 让master把它加入到集群里, 关闭之后也可以把自己从集群中删除.我这里使用的是flas ...

  7. SPOJ D-query(莫队算法模板)

    题目链接:http://www.spoj.com/problems/DQUERY/ 题目大意:给定一个数组,每次询问一个区间内的不同元素的个数 解题思路:直接套莫队的裸题 #include<cs ...

  8. csu 1556(快速幂)

    1556: Jerry's trouble Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 787  Solved: 317[Submit][Statu ...

  9. 解决wordpress无法发送邮件的问题|配置好WP-Mail-SMTP的前提

    我的WordPress主机是万网的,配置WP-Mail-SMTP时一直无法发送邮件,导致设置失败.经过多次询问度娘才找到了解决wordpress无法发送邮件的方法,在这里把这个wordpress技巧分 ...

  10. 【转载】OpenMAXIL介绍与其体系

    1 OpenMAX IL介绍与其体系 这一部分的文档描述 OpenMAX IL的特性与体系. 1.1 OpenMAX IL 简述 OpenMAX IL 软件接口层定义了一套API,用于访问系统中的组件 ...