小科技之卷积解决字符串匹配问题
1|0小科技之卷积解决字符串匹配问题
OI中有各种字符串匹配问题,常见的有单模式串匹配、多模式串匹配和子串匹配等,一般可以用KMP、AC自动机、SAM解决。如果涉及到其他形式的单模式串匹配,这些传统的方式很不好解决,有没有更灵活的处理方法或者通法呢?
答案是有的,而且就是耳熟能详的FFT/NTT。
我们先考虑最基础的单模式串匹配,求长为m的字符串T在长为n的字符串S里出现了多少次,只不过我们要用卷积来实现。具体的,我们设
这时前两项可以预处理后
注意到
从这个算法得到启发,我们来总结做题的方法。
第一步:设计通配函数,即上文中的
第二步:设计完全通配函数,即上文中的
第三步:计算每一位的完全通配函数的值。
来看几道简单的例题叭
题意:带通配符
思路:因为有通配符的存在,所以我们设计
显然,完全通配函数就是
如何快速计算呢?我们把b翻转,就可以得到
这个形式就和卷积一样了,我们只需把
题意:定义两个字符串匹配当且仅当T中每一个字符可以在S中找到一个相距不超过k的相同字符,求T在S中出现次数,字符集大小为4。
思路:这一题乍一看不好直接设计通配函数,我们发现这一题的字符集大小只有4,于是尝试对每一位分开计算。具体的当处理到字符ch时,我们把和ch相同的当成1,其他的是0,然后对S串正反扫一遍把所有与1相距不超过k的位置也标成1,这时两位匹配当且仅当
显然,完全匹配函数就是
根据我们的定义,
同样的,把T翻转,那么
这样就可以卷积了。复杂度
题意:求有多少个S的子串满足修改小于等于3个位置能够变成T,字符集大小为4。
思路:看到字符集大小很小,就想到对每一种字符单独考虑。S、T中和字符c相等的位置为1,定义匹配函数为
这时完全匹配函数就呼之欲出了。
如果
显然,计算时将T翻转 (是不是很套路?) ,得:
这样就可以愉快地卷积了。复杂度
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/17207151.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】