原题链接
题意简述
给定 T 组数据,每组包含一个长度为 n 的字符串 s 和一个长度为 m 的字符串 t。
可以将 s 中任意与 t 相同的子串替换为 *
,求有多少种不同的替换方案。
解题思路
定义 fi 表示在 s[0:i] 范围内进行替换的方数:
- 当 i<m 时,字符串长度不足,无法替换,所以 fi=1。
- 若 s[i−m:i−1]=t,可以选择替换 s[i−m:i−1],但要求替换前的部分不能重叠。因此可以增加方案数 fi−m,所以 fi←fi−1+fi−m。
- 否则,只能选择不替换,所以 fi←fi−1。
状态转移方程:
fi=⎩⎨⎧1fi−1+fi−mfi−1i<ms[i−m:i−1]=telse
利用 KMP 或 Rabin–Karp 等字符串匹配算法,可以单次 O(1) 判断 s[i−m:i−1]=t 是否成立。