当前位置: 首页 > news >正文

P10477 Subway tree systems 题解,c++ 树相关题目

题目

poj 链接
洛谷链接

n n n 组数据,每组数据给定两个 01 01 01 串(长度不超过 3000 3000 3000),意思如下:

  • 对于每一个 0 0 0,代表该节点有一个子节点,并前往该子节点。
  • 对于每一个 1 1 1,代表返回该节点的父亲节点。

求两个字符串说表示的树是否同构。
在这里插入图片描述

思路

考虑对于每一个节点进行递归处理(因为可以知道一个大问题可以拆成多个小问题进行计算)。为方便后续操作,可虚构一个根节点的父亲节点(即在字符串开头加上 0 0 0,结尾加上 1 1 1)。

对于每一个节点,我们可以获得一个字符串代表该节点的子树,首先去掉头尾的字符(即去掉通往父亲节点的边),记 S S S 为字符串, c n t cnt cnt 表示 S S S 0 0 0 i i i 0 0 0 的数量与 1 1 1 的数量的差, j j j 表示儿子的数量。容易得到以下结论:

  • 对于 S i = 0 S_i = 0 Si=0,则 c n t ← c n t + 1 cnt \gets cnt + 1 cntcnt+1
  • 对于 S i = 0 S_i = 0 Si=0,则 c n t ← c n t − 1 cnt \gets cnt - 1 cntcnt1
  • 对于 c n t = 0 cnt = 0 cnt=0,即一个儿子已经遍历结束,则 j ← j + 1 j \gets j + 1 jj+1,并统计前一个儿子所代表的子串进行递归。

如果全部儿子所代表的子串递归完毕,可按照字符串排序的方式排列儿子所代表的字符串,并在头尾添上 01 01 01。可以发现,对于两个同构的树,以上操作后获得的字符串相等。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
string a,b;
string paixu(string x) {//cout<<x<<endl;// 分离操作string y = x;int num = x.size(),cnt = 0;x = "";if(num <= 2) return y;for(int i = 1;i < num - 1;i++) x += y[i];num -= 2;string new_string[1505];int j = 1;for(int i = 0;i < num;i++) {if(x[i] == '0') cnt++,new_string[j] += '0';else cnt--,new_string[j] += '1';if(cnt == 0) {j++;}}j--;//递归for(int i = 1;i <= j;i++) new_string[i] = paixu(new_string[i]);//排序for(int i = j;i >= 1;i--) {for(int k = 1;k < i;k++) {if(new_string[k] > new_string[k + 1]) swap(new_string[k],new_string[k + 1]);}}for(int i = 2;i <= j;i++) new_string[1] += new_string[i];//cout<<("0" + new_string[1] + "1")<<endl;return ("0" + new_string[1] + "1");
}
signed main() {scanf("%lld",&T);while(T--) {cin >> a >> b;a = "0" + a + "1";b = "0" + b + "1";if(paixu(a) == paixu(b)) printf("same\n");else printf("different\n");}return 0;
}
http://www.lryc.cn/news/410959.html

相关文章:

  • 18.jdk源码阅读之CopyOnWriteArrayList
  • 美股:AMD展现乐观前景,挑战AI加速器市场霸主
  • 如何提高计算机视觉技术在复杂环境和低光照条件下的物体识别准确率?
  • ubuntu cmake使用自己版本的qt
  • Python基础知识笔记---保留字
  • Python面试整理-Web开发
  • 民大食堂用餐小程序的设计
  • Linux系统编程(4):消息队列
  • 【初阶数据结构篇】单链表的实现(赋源码)
  • LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)
  • 昇思MindSpore 应用学习-基于 MindSpore 实现 BERT 对话情绪识别
  • 【初阶数据结构篇】顺序表和链表算法题
  • 使用weex进行APP混合开发
  • C++stl大根堆/小根堆的创建与记忆
  • visual studio性能探测器使用案列
  • redis的代码开发
  • 嗷呜,就问你接不接?
  • 避免过拟合,参数大模型强,正则让模型不要走偏
  • vue+element-ui的列表查询条件/筛选条件太多以下拉选择方式动态添加条件(支持全选、反选、清空)
  • LLM的训练与推断
  • uniapp使用WebSocket uniapp使用WebSocket Uniapp整合WebSocket uniapp使用 websocket
  • SSH Exporter:基于Prometheus的远程系统性能监控神器
  • Docker基础概念
  • 小白进阶为大神
  • 2024最新Python和PyCharm的安装教程
  • 数据库死锁:深入解析与应对策略
  • Python入门宝藏《看漫画学Python》,495页漫画带你弄清python知识点!简单易懂 | 附PDF全彩版
  • Webshell管理工具:AntSword(中国蚁剑)
  • Java 中的File类
  • java将map转json字符串或者再将json字符串转回map,java将对象转json字符串或者互想转换,对象集合和json字符串互转