Problem Description

Keke 是一个喜爱种树的人,他对各种树都有很深的研究。

MLE 听说 bLue 种了一些新品种的树,就想邀请 Keke 去围观一下。

PBH 在暗中把这一切尽收眼底,作为资深植树行家,他虽不屑,但也决定和他们一起去看一看。

于是,大家便一起到了 bLue 家去看树。

bLue 有两棵二叉树,分别有 n 和 m 个节点,编号分别为 1-n 和 1-m,每个节点都有一个权值,bLue 想知道第一棵树的所有子树中与第二棵树完全相同的个数(不考虑节点编号)。

Input

输入数据有多组(数据组数不超过 150),到 EOF 结束。

对于每组数据:

  • 第一行有两个整数 n (0 < n <= 10^5) 和 m (0 < m <= 10^5),表示第一棵树和第二棵树的节点个数
  • 接下来 n 行,表示第一棵树:第 i (0 < i <= n) 行有 3 个整数,w[i] (0 < w[i] <= 10), lc[i], rc[i] (0 < lc[i], rc[i] <= n),分别表示节点 i 的权值,该节点的左孩子编号和右孩子编号,若某个孩子不存在,则为 0 (数据保证每棵树都是合法的有根二叉树)
  • 接下来 m 行,表示第二棵树:格式同第一棵树

保证:树的最大深度不会超过 10000。

Output

对于每组数据,输出一行一个整数 num,表示第一棵树的所有子树中与第二棵树完全相同的个数。

Example Input

7 4
1 6 3
2 0 4
1 7 0
3 0 0
1 2 1
2 0 0
2 0 0
2 0 0
1 4 0
1 1 2
2 0 0
3 3
1 0 0
2 1 3
3 0 0
1 0 3
2 1 0
3 0 0

Example Output

1
0

Hint

数据量比较大,推荐用 scanf 等读入。

Author

「“师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛」不得不放弃、

官方题解:

[3926] E - bLue的二叉树
by 不得不放弃、
这个题题意很简单,就是求 A 树中的 n 个非空子树中与 B 树相同的个数。
直接暴力求解当然是会 TLE 的,不过加上一些剪枝应该是可以过的。
比如先一遍 DFS 把 A 树的每个子树的深度求解出来,再依次与 B 树对比,如果当前子树的深度与
B 树的深度相同并且当前节点的权值与 B 树的根节点的权值相等,那么就再 DFS 验证一下。
本题还可以哈希过,对每个子树进行哈希,再对比即可,不过哈希的姿势要好。
那么最简单的解法是什么呢?
这个题是用 KMP 做的(其实题目前三行也有暗示 2333)。
先分别把两棵树的权值的前序或者后序遍历序列(以下简称序列)跑出来,注意空节点用一个题目
里不存在的权值表示,然后 A 串作为母串,B 串作为子串,直接求 A 中 B 出现的次数即可。
容易知道,两颗相同的树的序列是完全相等的,我们把它扩展一下,到一棵树的某个子树与另一棵
树比较,作为一颗子树,它的序列必定是整棵树的序列的字串(注意不是子序列),这样的话就很
容易想到用 KMP(也可以用其他匹配算法)来做。
那么有人就有疑问了,如果两个不同子树的序列连起来刚好包含了 B 树的序列怎么办?
前面提到过,空节点也要放进序列里面,并且要用题目里不会出现的权值,这样就可以避免这个问
题。

#include<bits/stdc++.h>
#define LL long long
#define MEM(a, b) memset(a, b, sizeof(a))
using namespace std;
struct Node
{int w, lc, rc;
};
Node a[100005], b[100005];
int avis[100005], bvis[100005];
int na[100005 * 3 + 10], nb[100005 * 3 + 10];  // 包含空节点所以数组大小扩大3倍
int nest[100005 * 3 + 10];
int la, lb;
void adfs(int x)
{na[la++] = a[x].w;if(x == 0) return;adfs(a[x].lc);adfs(a[x].rc);
}
void bdfs(int x)
{nb[lb++] = b[x].w;if(x == 0) return;bdfs(b[x].lc);bdfs(b[x].rc);
}
void Getnest(int n)
{int j = 0;int i = 1;nest[1] = 0;while(i <= n){if(j == 0 || nb[i] == nb[j]){j++;i++;if(nb[i] == nb[j])nest[i] = nest[j];elsenest[i] = j;}elsej = nest[j];}
}
int kmp(int n, int m)
{int i = 1;int j = 1;int ans = 0;while(i <= n){if(j == 0 || na[i] == nb[j]){i++;j++;}elsej = nest[j];if(j >= m + 1){ans++;j = nest[j];}}return ans;
}
int main()
{int n, m;while(scanf("%d %d", &n, &m) != EOF){MEM(avis, 0);MEM(bvis, 0);for(int i = 1 ; i <= n ; i++){scanf("%d %d %d", &a[i].w, &a[i].lc, &a[i].rc);avis[a[i].lc]++;avis[a[i].rc]++;}for(int i = 1 ; i <= m ; i++){scanf("%d %d %d", &b[i].w, &b[i].lc, &b[i].rc);bvis[b[i].lc]++;bvis[b[i].rc]++;}la = lb = 1;for(int i = 1 ; i <= n ; i++)if(avis[i] == 0){adfs(i);break;}for(int i = 1 ; i <= m ; i++)if(bvis[i] == 0){bdfs(i);break;}Getnest(lb - 1);int ans = kmp(la - 1, lb - 1);printf("%d\n", ans);}
}

山东理工acm 3926 bLue的二叉树相关推荐

  1. 山东理工ACM【2105】小泉的难题

    小泉的难题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 机械实验班有个同学叫小泉,有一天数学老师给小泉布置了一道个人作业,给小 ...

  2. 山东农业大学acm第三周学习总结报告

    山东农业大学--ACM--第三周学习总结 一.本周学习总结回顾 本周学习内容是延续上周所学习的贪心算法而来的:所谓贪心就是用最简单最快捷的方式完成题目要求. 贪心有很多经典题目,下面进行一一列举和自己 ...

  3. 伪站创建代码-山东理工

    山东理工大学官网建立伪站: <!doctype html> <html><head><meta charset="utf-8">&l ...

  4. bLue的二叉树_JAVA

    Description Keke 是一个喜爱种树的人,他对各种树都有很深的研究. MLE 听说 bLue 种了一些新品种的树,就想邀请 Keke 去围观一下. PBH 在暗中把这一切尽收眼底,作为资深 ...

  5. 赛联区块链教育受邀为山东理工区块链技术培训讲座

    2021年11月6日-7日,应山东理工大学计算机科学与技术学院邀请,赛联区块链教育张群.曲春杰等4位专家进入山东理工大学校园,为计算机学院师生开展区块链技术专题讲座,全校300余名师生共同聆听讲座. ...

  6. ACM模式数组构建二叉树

    那么此时大家是不是应该知道了,数组如何转化成 二叉树了.如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2. #include <iostre ...

  7. 南阳理工ACM 题4《ASCII码排序》

    4-ASCII码排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:76 submit:115 题目描述: 输入三个字符(可以重复)后,按各字符的A ...

  8. 山东理工大学ACM平台题答案关于C语言 2098 识别浮点常量问题

    识别浮点常量问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 编译器在对程序进行编译之前,首先要进行语法分析.通常,程序被分解 ...

  9. 知到山东理工c语言答案,山东理工大学C语言实验.doc

    山东理工大学C语言实验 山东理工大学 C语言实验指导[答案] 实验一? 顺序结构程序设计(2学时) //姓名:*** //班级:*** //学号:*** //参考测试数据:输入:0 0 180 输出: ...

  10. 经典DP 嵌套矩形 (南洋理工ACM—16)

    本来是个很水的DP,结果被自己的代码习惯给打败了 代码: 1 #include<iostream> 2 #include<stdlib.h> 3 #include<str ...

最新文章

  1. linux的mount(挂载)命令详解
  2. P1276 校门外的树(增强版)(线段树)(校门三部曲)难度⭐⭐⭐
  3. PLSQL_性能优化系列04_Oracle Optimizer优化器
  4. 训练作用_我们口才训练微信群有哪些重要作用?
  5. tomcat进程意外退出的问题分析
  6. 江西省一级计算机考试试题,江西省计算机一级考试试题
  7. MFC中静态文本控件显示的几种实现方式
  8. 计算机考试题操作题答案,全国计算机等级考试模拟题一(带操作题及答案)
  9. 【python】sys.stdout输出不换行
  10. matlab噪声 方差_产生多种分布的热噪声信号
  11. 利用pt-table-checksum校验数据一致性
  12. unity资源包package的导入导出
  13. 100天python、github_GitHub - 1392792445/Python-100-Days: Python - 100天从新手到大师
  14. java 汉字处理_Java汉字处理
  15. 自动量程万用表的实现原理_自动量程万用表模块设计方案[图]
  16. 论文阅读《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》
  17. 两金压降两金指什么_什么是两金压降
  18. 【Day5.6】当地人的美食街
  19. win10下安装php7.2的memcache扩展
  20. 亲戚(relative)

热门文章

  1. Windows查看ssh公钥方法
  2. 编译内核出错:Unable to find the ncurses package. recipe for target ‘scripts/kconfig/.mconf-cfg‘ failed
  3. How a non-windowed component can receive messages from Windows -- AllocateHWnd
  4. ups机房动环监控系统方案
  5. 网站被劫持了怎么办?
  6. 用了服务器后网站统计代码被劫持,网站劫持代码,网站被劫持怎么办 | 帮助信息-动天数据...
  7. html 调用桌面exe程序,如何使用HTML、CSS和JavaScript轻松构建桌面应用程序
  8. Dubbo 常见的负载均衡(Load Balance)算法,一起学习一下吧~
  9. javascript中的字符串编码转换
  10. 深度:蚂蚁金融科技全面开放战略背后的技术布局