题意:给你一个括号序列S,再给你一个N,求长度为2N,且含有子串S,满足括号匹配的序列总数。
链接:http://codeforces.com/contest/1015/problem/F
思路:首先定义状态,假设有一个合法序列,显然需要满足以下三个状态:
- 长度为2N
- 满足括号匹配,这里我们不妨设为'('大于')'的数量,如果为0,说明是合法序列
- 包含子串S
所以我们设满足条件的序列为dp[i][j][k],i,j,k分别对应1,2,3;
接下来考虑转移,我们这里去考虑贡献更为方便,对于某i长度的个序列,其’(‘比')'多j个,其后缀可能完全匹配子串S,也可能完全不匹配,我们基于此考虑在其末尾加上'('或')'两种情况,假设已经匹配了k长度:
- 那么如果我们再往后添加一个'(':
- 如果S[k]=='(',那么匹配成功,所以得到转移方程dp[i+1][j+1][k+1]+=dp[i][j][k];
- 如果S[k]==')',那么匹配失败,这里的转移方程是dp[i+1][j-1][fail[k]]+=dp[i][j][k]; (这里的fail不是next数组,手撕几个例子就懂是什么了,其