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构成】

传送门:CF1038F code:

做法还是很类似吧。不过在这个地方我们需要枚举我们选择的串的最长后缀 which 能与str的前缀匹配上

(len(str))次dp即可。

栗子3:给一个str,求有多少个长度为n的合法括号序列包含子串str。
【串由`(`,`)`组成】

辣鸡题解

原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9607804.html