Subway (树中心 + 树hash)
首先找到树的中心或者中心,我这里是找中心,因为我们需要找一个相同的起点,然后最多2个中心就是树的宽度为偶数时,奇数时为1个。
找到之后需要对树进行hash,使得每个点都具备独特性,使之树的形态能够保证唯一,然后利用hash值,对树的每个节点下的节点进行排序,之后如果判定这两个树是一样的话,我只需要对树进行一次深搜并把遍历的顺序存进数组。然后直接按照数组中的值输出原来映射的字符串就好了。
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int mod = 1e9 + ;
const int maxn = 1e5 + ;
const int seed = ;
char inp[], onp[]; struct Tree{
map<string, int>id;
vector<int>edge[maxn];
string anw[maxn], rip[maxn];
int _cnt, ctr[], siz[maxn], dep[maxn], fa[maxn];
LL Har[maxn]; ///将遍历顺序存进去
void done(int st, int fa){
if(fa == ) _cnt = ;
anw[_cnt ++] = rip[st];
for(auto x : edge[st]){
if(x == fa) continue;
done(x, st);
}
} ///hash技术
LL dfsh(int st, int fa){
Har[st] = seed;siz[st] = ;
for(auto x : edge[st]){
if(x == fa) continue;
dfsh(x, st);
siz[st] += siz[x];
}
sort(edge[st].begin(), edge[st].end(),
[&](int x, int y){return Har[x] < Har[y];});
for(auto x : edge[st]){
if(x == fa) continue;
Har[st] = (((Har[st] * Har[x]) % mod) ^ Har[x])% mod;
}
Har[st] = (Har[st] + siz[st]) % mod;
Har[st] = (Har[st] * Har[st]) % mod;
return Har[st];
} ///得到深度值
void getdep(int st, int Fa, int Dep){
dep[st] = Dep;fa[st] = Fa;
for(auto x : edge[st]){
if(x == fa[st]) continue;
getdep(x,st,Dep + );
}
} ///获取中点
void getCtr(int n){
getdep(, , );
ctr[] = max_element(dep + , dep + + n) - dep;
getdep(ctr[], , );
ctr[] = max_element(dep + , dep + + n) - dep;
int fdep = dep[ctr[]];
for(int i = ; i < fdep/; i ++)
ctr[] = fa[ctr[]];
ctr[] = ctr[];
if(fdep & ) ctr[] = fa[ctr[]];
} ///重置数据
void init(int n){
for(int i = ; i <= n; i ++)
edge[i].clear();
id.clear();_cnt = ;
} ///映射连接的符号,并存进对应的map值为下标的地方
int toid(string v){
if(id.find(v) != id.end()) return id[v];
rip[_cnt] = v;
return id[v] = _cnt ++;
} ///建图,映射值
void input(int n){
init(n);int l,r;
for(int i = ; i < n; i ++){
scanf("%s %s", inp, onp);
l = toid(inp); r = toid(onp);
edge[l].push_back(r);
edge[r].push_back(l);
}
}
}X, Y; void solve(){
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
if(X.dfsh(X.ctr[i], ) == Y.dfsh(Y.ctr[j], )){
X.done(X.ctr[i], );
Y.done(Y.ctr[j], );
return;
}
} int main(){
int n;while(~scanf("%d", &n)){
X.input(n);
Y.input(n);
X.getCtr(n);
Y.getCtr(n);
solve();
for(int i = ; i < n; i ++)
printf("%s %s\n",X.anw[i].c_str(), Y.anw[i].c_str());
}return ;
}
这次的代码可以说是照搬过来的,菜鸡的自己。
Subway (树中心 + 树hash)的更多相关文章
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...
- MySQL的B+树索引和hash索引的区别
简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构:索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询一次,如果不使用索引 ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- 主席树套树状数组——带修区间第k大zoj2112
主席树带修第k大 https://www.cnblogs.com/Empress/p/4659824.html 讲的非常好的博客 首先按静态第k大建立起一组权值线段树(主席树) 然后现在要将第i个值从 ...
- HDU4819 Mosaic【树套树】
LINK 题目大意 给你一个\(n*n\)矩阵,每个点有初始权值 q次询问每次把一个矩形的中心节点变成这个矩形中最大值和最小值的平均数 思路 很显然的树套树啊 就是一开始傻逼了没想到怎么去维护这个东西 ...
- HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- Java 第二次测试总结
Java 第二次测试总结 1. 相关知识点总结 Java测试题循环与递归知识点 补充知识点: for循环语句:for(表达式1:表达式2:表达式3)表达式一负责完成变量的初始化!表达式2是值为bool ...
- JQPRINT-不错的jquery打印插件
1.首先引用Jquery和jqprint-0.3.js(依赖于Jquery的) <script language="javascript" src="jquery- ...
- 获取链接的参数,判断是否是微信打开,ajax获取数据
//获取链接参数function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...
- pandas基础
1.相关库导入 2.创建数据结构 pandas 有两个重要的数据结构: Series 和 DataFrame 创建Series数组,代表一行或一列 创建DataFrame ,代表二维数组 第一种方式: ...
- kubernetes的CI/CD
部署流程:把编码上传到gitlab上,使用webhook链接jenkins自动去编译docker镜像,然后上传到harbor本地docker镜像库中,再自动下载docker镜像,使用k8s控制dock ...
- Jenkins打包安卓时提示没同意constraintLayout的license的解决方法
使用Jenkins打包安卓项目时,报错并失败,错误信息: You have not accepted the license agreements of the following SDK compo ...
- mysql跨库复制: replicate_wild_do_table和replicate-wild-ignore-table
使用replicate_do_db和replicate_ignore_db时有一个隐患,跨库更新时会出错. 如设置 replicate_do_db=testuse mysql;update test. ...
- 008-js中的正则表达式
查看地址:http://www.runoob.com/js/js-regexp.html 一.正则表达式概述 正则表达式(英语:Regular Expression,在代码中常简写为regex.reg ...
- TCP、UDP和HTTP详解
http:是用于www浏览的一个协议.tcp:是机器之间建立连接用的到的一个协议. 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.在网络层有IP协议.ICMP协议.ARP协议.R ...
- Mac搭建PHP+rabbitMQ环境
RabbitMQ是一个在AMQP基础上实现的企业级消息系统.何谓消息系统,就是消息队列系统,消息队列是“”消费-生产者模型“”的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅 ...