[ 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”。

  3.所有子串排序组合到一起然后重新替代原串,此时的新str即为最小表示(sort字典序排序)。

  4.两串进行比较即可。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int n;
void dfs(string& str) {
	if(str.length() == 2) return;
	vector<string> substrs;
	int z = 0, start = 0, end = 0;
	for(int i = 0; i < str.length(); i++) {
		if(str[i] == ‘0‘) z++;
		else if(str[i] == ‘1‘) {
			z--;
			if(z == 0) {
				end = i;
				string substr = str.substr(start + 1, end - 1 - start);
				dfs(substr);
				substrs.push_back(‘0‘ + substr + ‘1‘);
				start = i + 1;
			}
		}
	}
	sort(substrs.begin(), substrs.end());
	str = "";
	for(int i = 0; i < substrs.size(); i++) {
		str += substrs[i];
	}
}
int main() {
	cin >> n;
	while(n--) {
		string str1, str2;
		cin >> str1 >> str2;
		if(str1.length() != str2.length()) {
			cout << "different" << endl;
			continue;
		} else {
			dfs(str1), dfs(str2);
			if(str1 == str2) cout << "same" << endl;
			else cout << "different" << endl;
		}
	}
	return 0;
}

  

时间: 2024-10-29 20:48:06

[ POJ ][ HASH ] 1635 Subway tree systems的相关文章

[有向树的最小表示] 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 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】Subway Tree Systems

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

poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法

Description Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, there is one and only one way of going by subway. Moreover, most of these cities have a unique central station. Imagine you are a tourist in o

POJ1635Subway tree systems

Subway tree systems Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8049   Accepted: 3357 Description Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, there is one and only one way of going

【POJ 3321】 Apple Tree (dfs重标号设区间+树状数组求和)

[POJ 3321] Apple Tree (dfs重标号设区间+树状数组求和) Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21966   Accepted: 6654 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. K

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析: 单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存. 还