[HEOI2015]最短不公共子串
题意:
给出两个字符串 和 ,分别求出:
1.最短的串,是 的子串,不是 的子串。
2.最短的串,是 的子串,不是 的子序列。
3.最短的串,是 的子序列,不是 的子串。
4.最短的串,是 的子序列,不是 的子序列。
一道四合一题,如果分开做前两个好说,后两个得有点操作 ,不过由于我太菜做不得。而且暂时还不想学后两个点单独怎么做。
那我们把这四个看成一类问题。
考虑自动机:一个节点表示一个状态,每条边表示状态的转移。由于子串和子序列都能建出自动机来,那么我们只需要对两个自动机进行相同的转移,则 中有而 中没有的状态就是我们要找的答案。
子序列建成自动机这个应该都会,由于希望最长的匹配,肯定相同的字符越靠前越好。每个位置是一个点,向后每个字符往离它最近的点连边,时间复杂度与空间复杂度均为 字符集大小 。
子串建成自动机可以选择前缀自动机也可选择后缀自动机,而这题数据范围是 ,因为复杂度瓶颈并不在这里,当然如果不想考虑空间的话可以写 。我们这里只需要用 当自动机就可以了,把每个子串取出来建立一个 ,字符总长度 ,时间复杂度与空间复杂度均为 。看着大算算其实可过。
那么自动机就建好了,每次询问是什么,就把两个字符串建成相应的自动机就好了。那么现在考虑如何找答案。
因为一条边相当于加进去一个字符,我们进行 ,遇到第一个 中存在而 中不存在的状态就把长度 输出出来。如果遍历 的完整个自动机(自动机肯定不会有环的),还没有找到一个 中没有的状态,那 就太逊了,输出 。
考虑 复杂度: 进行 时,由于 是像树一样的结构,每个点只会被遍历一次,复杂度不会超过 。而当两个序列自动机进行遍历的时候,由于到达一个点可以通过不同的路径,如果无脑加点会被卡成指数级。我们需要用 数组记录一下哪些状态到达过,由于序列自动机节点有 个,这样时间复杂度与空间复杂度也都是 的,而且这个复杂度瓶颈不可避,前面自然也就不需要那么优了。
不过要注意只有两个自动机同时为序列自动机的时候才用 ,否则 那么多点也开不下是吧~
的做法:
后缀自动机时间建立的复杂度是 的,空间复杂度是 的,这让人很舒服,但是由于到达一个点同样有多条路径,我们每次 都要记录 。
要注意 数组要开两倍。
__EOF__

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具