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>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long int LL;
const int MAXN=+;
int fa[MAXN];
char strA[MAXN],strB[MAXN];
vector<int>treeA[MAXN],treeB[MAXN];
void build(char *s,vector<int>tree[MAXN]){
int hashNum=,now=,len=strlen(s);
for(int i=;i<MAXN;i++){
tree[i].clear();
}
for(int i=;i<len;i++){
if(s[i]==''){
fa[hashNum]=now;
tree[now].push_back(hashNum);
now=hashNum++;
}
else{
now=fa[now];
}
}
}
string dfs(int now,vector<int>tree[MAXN]){
vector<string>HashC;
for(int i=;i<tree[now].size();i++){
HashC.push_back(dfs(tree[now][i],tree));
}
string Hash="(";
sort(HashC.begin(),HashC.end());
for(int i=;i<HashC.size();i++){
Hash+=HashC[i];
}
Hash+=")";
return Hash;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%s",strA); scanf("%s",strB);
memset(fa,,sizeof(fa));build(strA,treeA);
memset(fa,,sizeof(fa));build(strB,treeB);
if(dfs(,treeA)==dfs(,treeB)){
printf("same\n");
}
else{
printf("different\n");
}
}
return ;
}
思路2:HASH,思路参照:集训队论文:杨弋《Hash在信息学竞赛中的一类应用》
题目卡的比较死。 参数不好拿捏。最好进行Double HASH比较保险
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long int LL;
typedef unsigned int uint;
const int MAXN=+;
const int MODF=1e9+;
const int MODS=1e9+;
int fa[MAXN],HF[MAXN],HS[MAXN];
char strA[MAXN],strB[MAXN];
vector<int>treeA[MAXN],treeB[MAXN];
void build(char *s,vector<int>tree[MAXN]){
int hashNum=,now=,len=strlen(s);
for(int i=;i<MAXN;i++){
tree[i].clear();
}
for(int i=;i<len;i++){
if(s[i]==''){
fa[hashNum]=now;
tree[now].push_back(hashNum);
now=hashNum++;
}
else{
now=fa[now];
}
}
}
pair<int,int> dfs(int now,vector<int>tree[MAXN]){
int HashNumF=,HashNumS=;
vector<pair<int,int> >HashC;
for(int i=;i<tree[now].size();i++){
HashC.push_back(dfs(tree[now][i],tree));
}
sort(HashC.begin(),HashC.end());
for(int i=;i<HashC.size();i++){
HashNumF=((HashNumF^HashC[i].first)*HF[i])%MODF;
HashNumS=((HashNumS^HashC[i].second)*HS[i])%MODS;
}
return make_pair(HashNumF%MODF,HashNumS%MODS);
}
int main()
{
for(int i=;i<MAXN;i++){
HF[i]=rand()%MODF;
HS[i]=rand()%MODS;
}
int t;
scanf("%d",&t);
while(t--){
scanf("%s",strA); scanf("%s",strB);
memset(fa,,sizeof(fa));build(strA,treeA);
memset(fa,,sizeof(fa));build(strB,treeB);
pair<int,int>TA=dfs(,treeA);
pair<int,int>TB=dfs(,treeB);
if(TA.first==TB.first&&TA.second==TB.second){
printf("same\n");
}
else{
printf("different\n");
}
}
return ;
}
POJ 1635 树的最小表示法/HASH的更多相关文章
- POJ 1635 树的最小表示法
题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...
- POJ1635 Subway tree systems ——(判断树的同构,树的最小表示法)
给两棵有根树,判断是否同构.因为同构的树的最小表示法唯一,那么用最小表示法表示这两棵树,即可判断同构.顺便如果是无根树的话可以通过选出重心以后套用之前的方法. AC代码如下: #include < ...
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- HDU 1954 Subway tree systems (树的最小表示法)
题意:用一个字符串表示树,0代表向下走,1代表往回走,求两棵树是否同构. 分析:同构的树经过最小表示会转化成两个相等的串. 方法:递归寻找每一棵子树,将根节点相同的子树的字符串按字典序排列,递归回去即 ...
- UVA 719 / POJ 1509 Glass Beads (最小表示法/后缀自动机)
题目大意: 给出一个长度为N的字符串,求其字典序最小的循环同构. N<=10W. 算法讨论: 算法一.最小表示法.定义题. 算法二.后缀自动机. Codes: #include <iost ...
- 1282 时钟(最小表示法+hash)
1282 时钟 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N个时钟,每个时钟有M个指针,P个刻度.时钟是圆形的,P个刻度均分整 ...
- POJ 1635 Subway tree systems (树的最小表示法)
题意:一串01序列,从一个点开始,0表示去下一个点,1表示回到上一个点,最后回到起点,遍历这棵树时每条边当且仅当走2次(来回) 给出两串序列,判断是否是同一棵树的不同遍历方式 题解:我们把每一个节点下 ...
- POJ1635 树的最小表示法(判断同构)
Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, ther ...
- luogu P5043 【模板】树同构 hash 最小表示法
LINK:模板 树同构 题目说的很迷 给了一棵有根树 但是重新标号 言外之意还是一棵无根树 然后要求判断是否重构. 由于时无根的 所以一个比较显然的想法暴力枚举根. 然后做树hash或者树的最小表示法 ...
随机推荐
- 如何:使用PicturBox实现类似淘宝网站图片的局部放大功能
转载至http://xuzhihong1987.blog.163.com/blog/static/267315872011822113131823/ 概要: 本文将讲述如何使用PictureBox控件 ...
- mongodb3.x用户角色
用户和角色是多对多的关系,一个用户可以对应多个角色,一个角色可以拥有多个用户.用户角色的不同对应的权限也是不一样的.下面是一些分配给用户的常见的角色. read ...
- CUDA中并行规约(Parallel Reduction)的优化
转自: http://hackecho.com/2013/04/cuda-parallel-reduction/ Parallel Reduction是NVIDIA-CUDA自带的例子,也几乎是所有C ...
- jvm分析
是什么 jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等. jstack 观察jvm中当前所有线程的运行情况和线程当前状态. 系统崩溃了?如果java程序崩溃生成core文件,j ...
- 搞笑世界杯(codevs 1060)
题目描述 Description 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰,让人心痛不已. 于是有 人组织了一场搞笑世界杯,将这些被淘汰的强队重新组织起来和世界杯一同比赛.你和你的朋 ...
- chaper3_exerise_UVa455_周期串
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; ; int ...
- JS_ECMA基本语法中的几种封装的小函数-1
今天给大家介绍js ECMA中几个封装的小函数以及一些常用的函数小案例: 1,找重复的函数 <script> //在数组里面找重复: function findInArr(n,arr){ ...
- (转)Ehcache 整合Spring 使用页面、对象缓存
Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的 ...
- 借助LinkedHashMap实现基于LRU算法缓存
一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...
- windows服务 2.实时刷新App.config
参考 http://www.cnblogs.com/jeffwongishandsome/archive/2011/04/24/2026381.html http://www.cnblogs.com/ ...