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。
【串由`(`,`)`组成】

辣鸡题解

posted @ 2018-09-08 07:39  RUSH_D_CAT  阅读(197)  评论(0编辑  收藏  举报