- CF528D Fuzzy Search
题目:
有一个长度为 n 的串 S,以及长度为 m 的串 T。
现给定一个数 k ,我们说 T 在 S 的位置 i 匹配上,当且仅当对于每一个 1≤a≤m ,都有一个位置 1≤b≤n 满足 |(i+a−1)−b|≤k ,且 Sb=Ta 。
请回答 T 在 S 中匹配上了多少个不同的位置。
n,m,k≤2∗105
题解:
记 pi,ch 表示位置 i 上放上字符 ch 是否合法。pi,ch=1 当且仅当存在 sj=ch 且 |i−j|≤k。
求 pi,ch ,对于 si=c 将 pi−k,ch,pi−k+1,ch,…,pi+k−1,ch,pi+k,ch 设为 1,差分就行了。
设 fi 表示以 i 开头的长度为 |T| 字符串能与 T 成功匹配多少位。
fi=|T|∑j=1pi+j−1,tj
枚举每个字符 ch∈{ACTG},设 flagj 表示 Tj 是否等于 ch。那么字符 ch 给 fi 带来的贡献就是
fi=|T|∑j=1pi+j−1,ch×flagj
那么原式即为
ans=∑x−y=ifxflagy
将 S 翻转一下,得
ans=∑x+y=ifxflagy
用 FFT 一卷即可。
本文作者:trsins
本文链接:https://www.cnblogs.com/trsins/p/15776597.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步