P2395 题解
P2395
本篇题解主要展示一些工程化的写法。
题意
BBCode -> Markdown
分析
字符串大模拟,边读入边处理(流式)。
关于嵌套判断,类括号嵌套可以用栈处理;其余按照题面处理。
Unmatch 和 Unclosed 的区别可以理解为 Unmatch 是栈下溢(Underflow)或栈顶和括号不匹配,Unclosed 是读取完毕后栈喂空。
这题的细节很多,有的时候可能无法理解题面所表达的意思,那么就可以采用“设置”,用 constexpr / 宏控制程序的行为,然后通过调试找到正确的值。
代码
更新:洛谷升级到了 gcc 13,所以不再需要自定义实现的 std::ranges::split_view。代码 643 -> 457 lines。
450+ 行。
https://www.luogu.com.cn/paste/ro2k5zhk
简要概述一下:
- BBCodeReader 类,负责流式读取 BBCode 代码并调用回调(就像 SAX 那样)
- MarkdownWriter 类,提供一个回调函数,用于将抽象化的表达式流式转换为 Markdown 代码
- BBCodeIncrementalMarkParser 函数,增量解析 BBCode 方括号标签
- 一些零散的数据结构
- ACTP 命名空间,存储设置(constexpr)
其中一小半的代码是一个 ranges::split_view 的自定义实现,因为 gcc 11 的 bug 导致 STL 的无法使用。