码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2024.6.19刷题记录


    目录

    一、835. Trie字符串统计 - AcWing题库

    二、143. 最大异或对 - AcWing题库

    三、836. 合并集合 - AcWing题库

    四、837. 连通块中点的数量 - AcWing题库


    一、835. Trie字符串统计 - AcWing题库

    不会,线段树讲解来自题解(AcWing 835. 如何理解单(双)链表,Trie树和堆中的idx? - AcWing)。代码来自题解(AcWing 835. Trie字符串统计 - AcWing)。

    1. # 线段树
    2. N = int(1e5 + 5) # 节点数
    3. son = [[0 for _ in range(26)] for _ in range(N)] # N行26列,每一行是一个节点,26种指向
    4. cnt = [0 for _ in range(N)] # 节点值,个数
    5. idx = 0 # 新建节点下标
    6. # 插入
    7. def insert(x: str):
    8. global idx
    9. p = 0 # 从0开始搜索
    10. for i in range(len(x)):
    11. t = ord(x[i]) - ord('a')
    12. if not son[p][t]:
    13. # 不存在节点,创造一个节点
    14. # 在没有时才需新建节点
    15. idx += 1
    16. son[p][t] = idx
    17. p = son[p][t] # 递归下一个节点
    18. cnt[p] += 1 # 最后一个节点个数加一
    19. # 询问
    20. def query(x: str):
    21. p = 0 # 从0开始搜索
    22. for i in range(len(x)):
    23. t = ord(x[i]) - ord('a')
    24. if not son[p][t]:
    25. return 0
    26. p = son[p][t]
    27. return cnt[p]
    28. n = int(input())
    29. for _ in range(n):
    30. q, s = input().split()
    31. if q == 'I':
    32. insert(s)
    33. else:
    34. print(query(s))

    二、143. 最大异或对 - AcWing题库

    不会,思路来自题解(AcWing 143. 最大异或对(好题) - AcWing)和题解(AcWing 143. 最大异或对 - AcWing)。代码参考思路题解自写。

    1. N = int(1e5 + 10) # 二进制个数
    2. M = N * 31 # 一个十进制数转为二进制最多31位,最高位符号位
    3. # M代表一个数字串二进制可以到多长
    4. son = [[0 for _ in range(2)] for _ in range(M)]
    5. idx = 0
    6. def insert(x: int):
    7. global idx
    8. p = 0
    9. for i in range(30, -1, -1): # 注意30开始
    10. # 从最高位开始找
    11. v = x >> i & 1 # 模板,获取第i位的值
    12. if not son[p][v]:
    13. idx += 1
    14. son[p][v] = idx
    15. p = son[p][v]
    16. def search(x: int):
    17. p = 0
    18. ans = 0
    19. for i in range(30, -1, -1):
    20. # 同样从最高位找
    21. v = x >> i & 1
    22. '''
    23. 要理解到字典树本质是树,要从树的思维去思考,而不是数组,数组只是实现
    24. 从最高位开始找,保证当前最大
    25. 从低位开始不一定最大
    26. 因为是树,所以要先走异或路,并且要走到异或路去
    27. '''
    28. if son[p][v ^ 1]:
    29. # 和该位不同的存在
    30. ans = ans * 2 + 1 # 十进制,该位异或值为1
    31. p = son[p][v ^ 1] # 走到异或路
    32. else:
    33. # 不存在就找相同的
    34. ans = ans * 2 + 0
    35. p = son[p][v]
    36. return ans
    37. n = int(input())
    38. nums = list(map(int, input().split()))
    39. ans = 0
    40. for i in range(n):
    41. # 边插入,边搜索
    42. # 每次找当前最大,不用返回去重复找
    43. # a ^ b == b ^ a
    44. insert(nums[i])
    45. ans = max(ans, search(nums[i]))
    46. print(ans)

    三、836. 合并集合 - AcWing题库

    不会,来自题解(AcWing 836. 基础_并查集_合并集合java_python_c++ - AcWing)和其评论。

    1. # 树
    2. n, m = map(int, input().split())
    3. p = [i for i in range(n + 1)] # 父节点
    4. def find(x: int):
    5. # 查找父节点并路径压缩
    6. # 路径压缩是因为我们只需在意是否在同一父节点下
    7. # 递推而不是递归,递归的最大深度为1000,会爆栈
    8. global p
    9. root = x
    10. # 寻找根节点
    11. # 根节点的父节点是自己
    12. while root != p[root]: # 不是根节点
    13. root = p[root]
    14. # 将叶子节点的父节点均指向root
    15. while x != root:
    16. nxt = p[x] # 记录父节点,防止丢失
    17. p[x] = root
    18. x = nxt # 迭代下一个
    19. return root
    20. for _ in range(m):
    21. q, a, b = input().split()
    22. a, b = int(a), int(b)
    23. if q == 'M':
    24. p[find(a)] = find(b) # 合并两树
    25. elif q == 'Q':
    26. if find(a) == find(b):
    27. print("Yes")
    28. else:
    29. print("No")

    四、837. 连通块中点的数量 - AcWing题库

    节点数合并处参考题解(AcWing 837. 连通块中点的数量 - AcWing)。 

    1. n, m = map(int, input().split())
    2. p = [i for i in range(n + 1)]
    3. cnt = [1 for _ in range(n + 1)] # 储存含有多少个子节点
    4. def find(x: int):
    5. global p, cnt
    6. root = x
    7. # 寻找root
    8. while root != p[root]:
    9. root = p[root]
    10. while x != root:
    11. nxt = p[x]
    12. p[x] = root
    13. x = nxt
    14. return root
    15. for _ in range(m):
    16. q = list(input().split())
    17. if q[0] == 'C':
    18. a, b = int(q[1]), int(q[2])
    19. if find(a) == find(b):
    20. continue
    21. # 合并根节点时,合并子节点数,b祖先节点合并到a祖先节点上
    22. cnt[find(a)] += cnt[find(b)]
    23. p[find(b)] = find(a)
    24. elif q[0] == 'Q1':
    25. a, b = int(q[1]), int(q[2])
    26. print("Yes" if find(a) == find(b) else "No")
    27. elif q[0] == 'Q2':
    28. a = int(q[1])
    29. print(cnt[find(a)])

     完

    感谢你看到这里!一起加油吧!

  • 相关阅读:
    DC细胞膜仿生脂质体载体/巨噬细胞膜包被胡椒碱/红细胞磷脂酰乙醇胺脂质体的制备
    企业数据防泄密软件-文件外发管理,文件,文档,图纸不外泄
    Java面向对象编程
    R语言数据重塑
    科技助农、千城万店、一县一品数字化活动开启!​
    C++中的享元模式
    WuThreat身份安全云-TVD每日漏洞情报-2023-09-27
    Vue项目实战之人力资源平台系统(六)角色管理模块
    维度转换的艺术:Kylin Cube设计的自定义魔法
    盘点 4 个开源小游戏
  • 原文地址:https://blog.csdn.net/lshx4658/article/details/139759678
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号