Gym102803E Everybody Lost Somebody / 4.6 校内考试 Dark Blue(hush)
对于一个串 ,给出 串的 (height),其中部分 可能不知道,用 表示。求这个串。如有多解,输出字典序最小的。保证存在解。
,考试版本 。
字符串
并查集
后缀数组
拓扑排序
做法 1
这个部分的前半段继承于考场做法。
考虑 的情况,可以直接将所有相同的缩到一起,然后不同的连一条 的边,然后对于缩完的块拓扑排序,求出字典序最小的解。
这个缩到一起的过程,我们发现我们求 的时候有一个比较代码,这个代码会告诉我们那些字符串是相等的,然后模拟就完事了。
对于 的情况,我们发现接下来的问题有点困难了,但是我们观察 和 ,如果我们忽略 这个字符,考虑 这个后缀,忽略 这个字符,考虑 这个后缀,这两个后缀的大小关系是知道的,然后就可以讨论以下:
- 如果 ,那么 。
- 否则,。
两种分别连上 的边和 的边,然后拓扑排序即可。
但是拓扑排序可能会出现一个 环,于是可以按照后缀大小的顺序计算答案。
代码。
做法 2
虽然上面的做法可以直接通过校内考试出题人的数据,但是直接在 CF 上面被卡了。
因为 CF 是 的范围,可以直接暴力合并。
进一步可以发现,只要在合并的时候保持后缀大小顺序的连边,就可以通过了。
也就是:
void merge(int x, int y) { x = gf(x), y = gf(y); if(rk[x] < rk[y]) swap(x, y); if(x != y) fa[x] = y; }
代码。如果这个做法成立,可以通过倍增优化并查集进一步达到 。
做法 3
不幸的是,我擅长制造假做法,同时上面的不够优美而且不够正确。
通过对拍,可以直接卡掉:
20
20 9 17 10 4 12 19 8 7 1 3 18 2 16 11 6 15 5 14 13
1 1 -1 -1 2 -1 -1 1 -1 -1 1 -1 -1 2 -1 -1 2 -1 -1
这个会输出:
bccaddbbaadadeddacba
正确答案应该是:
bccaedbbaadaeeedacba
这个被叉实际上是对于信息利用不完全,有些点关系没有合并到,而正确的应该是对于 这个条件, 这段区间的字符都是相等的,之前的做法只合并了左右端点,因此有问题。
于是每次都是合并 上面的一段,使用并查集即可。
代码。
一次制造一堆假做法也没谁了😅。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App