kmp+DP x 子串相关的计数问题
kmp+DP
kmp其实相当于一台线性的AC自动机啊。所以在解决字符串匹配相关的状态转移问题上施展起来特别舒适。
栗子1:给一个str,求有多少个长度为n的串包含子串str。【串由01构成】
做法:
dp[i][j][2]
, 【前\(i\)位】【匹配到了\(str\)的第\(j\)位】【在之前是否完全匹配上过】的方案数。- 施展
KMP
,build出fail指针。 - 考虑
dp[i][j][0/1]
的转移。我们枚举第i+1
位选什么数字就好。
把这个问题稍作变动。
栗子2:给一个str,求有多少个长度为n的串,收尾拼接形成一个环后,包含子串str。
【串由01构成】
做法还是很类似吧。不过在这个地方我们需要枚举我们选择的串的最长后缀 which 能与str的前缀匹配上
做\(len(str)\)次dp即可。
栗子3:给一个str,求有多少个长度为n的合法括号序列包含子串str。
【串由`(`,`)`组成】