poj 1635

有根树同构。参考论文《hash在。。。。》

 1 #include <iostream>
2 #include <fstream>
3 #include <algorithm>
4 #include <cstring>
5 #include <climits>
6 #include <cmath>
7
8 using namespace std;
9
10 const int leaf_hash=2099;
11 const int pt=9323;
12 const int qt=8719;
13 char str1[3100], str2[3100];
14 char *p;
15
16 int Hash()
17 {
18 int sum=1;
19 if(*(p)==‘1‘&&*(p-1)==‘0‘){
20 p++;
21 //cout<<"leaf_hash="<<endl;
22 return leaf_hash;
23 }
24 while(*p!=‘\0‘ && *p++ == ‘0‘)//这个巧妙的循环,把子节点的hash值都加给了父节点,作为父节点的hash值
25 {
26 //cout<<"for"<<endl;
27 sum = (sum*(pt^Hash()))%qt;
28 }
29 // printf("sum==%d\n",sum);
30 return sum;
31 }
32
33
34 int main()
35 {
36 // freopen("input.txt", "r", stdin);
37 int T;
38 scanf("%d", &T);
39 while(T--)
40 {
41 scanf("%s%s", str1, str2);
42 p = str1;
43 int a = Hash();
44 p = str2;
45 //cout<<a<<endl;
46 int b = Hash();
47 //cout<<b<<endl;
48 if(a == b)
49 {
50 puts("same");
51 }
52 else
53 {
54 puts("different");
55 }
56 }
57 return 0;
58 }

poj 1635,布布扣,bubuko.com

时间: 2024-10-05 20:22:31

poj 1635的相关文章

[有向树的最小表示] poj 1635 Subway tree systems

题目链接: http://poj.org/problem?id=1635 Subway tree systems Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6541   Accepted: 2747 Description Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, th

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

Subway tree systems POJ - 1635 题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树,深搜完之后问这两棵树是不是同一棵树 /* 在poj上交需要加一个string头文件,不然会CE 树的最小表示 这里用的最小表示法就是将树的所有子树分别用1个字符串表示,要按字典序排序将他们依依连接起来.连接后如果两个字符串是一模一样的,那么他们必然是同构的.这样原问题就变成了子问题,子树又是一颗新的树. */ #include<iostream>

POJ 1635 树的最小表示法/HASH

题目链接:http://poj.org/problem?id=1635 题意:给定两个由01组成的串,0代表远离根,1代表接近根.相当于每个串对应一个有根的树.然后让你判断2个串构成的树是否是同构的. 思路:首先根据01串构造出树,然后求树的最小表示法判断同构. 详情参照:https://www.byvoid.com/blog/directed-tree-bracket-sequence/ #define _CRT_SECURE_NO_DEPRECATE #include<iostream>

POJ 1635 Subway tree systems Hash法判断有根树是否同构

Hash在信息学竞赛中的一类应用 中的某道例题 "不难想到的算法是使用两个字符串分别表示两棵树,但是如果使用Hash的话应该怎么做呢? 可以使用一种类似树状递推的方法来计算Hash值:  对于一个节点v,先求出它所有儿子节点的Hash值,并从小到大排序,记作H1,H2,„,HD.那么v的Hash值就可以计算为:   (((a * p) ^ H1 mod q) * p ^ H2 mod q).....  换句话说,就是从某个常数开始,每次乘以p,和一个元素异或,再除以q取余,再乘以p,和下一个元素

POJ 1635 树的最小表示法

题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序,来判断这个hash字符串是否相同 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6

csu 2014 summer trainning day 1 哈希

POJ 1200 题意:给定串s,串中不同字符数nc,所求子串长度n,求长度为n的不同的子串的个数 分析:处理长度很短的字符串哈希,数据保证可以无冲突存储下来,利用hash思想快速查询以前便利的结果,关键在于优化搜索. code: 1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #include <set> 5 using namespace std; 6 7 int c[

[ POJ ][ HASH ] 1635 Subway tree systems

首先,对于一个树,我们可以有一种压缩表示: 0010011101001011 其中 0 表示向下走,1 表示向上走.于是: 00100111|01|001011 对于每一段的 0 1 出现次数相同,这种hash方法叫 树的最小表示法 . 1635 题目精简大意:给你n对01字符串,判断每一对儿表示的是不是同一个树,方法: 1.定义 cnt, start, end 来记录当前0 1之和是否相等,start,end 记录相等时所得字数的范围. 2.去首尾得到子串,递归进行1步骤直到子串只为“0 1”

【POJ】【1635】Subway Tree Systems

树的最小表示法 给定两个有根树的dfs序,问这两棵树是否同构 题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html 题目要求判断两棵树是否是同构的,思路是用树的最小表示法去做.这里用的最小表示法就是将树的所有子树分别用1个字符串表示,要按字典序排序将他们依依连接起来.连接后如果两个字符串是一模一样的,那么他们必然是同构的.这样原问题就变成了子问题,子树又是一颗新的树. 1 Source Code 2 Problem: 1635 User:

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京