F. Bracket Substring

给定一个括号序列S和一个整数N,目标是找到长度为2N且包含S作为子串,并满足括号匹配的序列总数。通过定义状态dp[i][j][k]来表示长度为i,'('比')'多j个,已匹配子串S的k个字符的序列数量。通过转移方程计算不同情况下合法序列的数量,最后得出总和。
摘要由CSDN通过智能技术生成

题意:给你一个括号序列S,再给你一个N,求长度为2N,且含有子串S,满足括号匹配的序列总数。

链接:http://codeforces.com/contest/1015/problem/F

 

思路:首先定义状态,假设有一个合法序列,显然需要满足以下三个状态:

  1. 长度为2N
  2. 满足括号匹配,这里我们不妨设为'('大于')'的数量,如果为0,说明是合法序列
  3. 包含子串S

所以我们设满足条件的序列为dp[i][j][k],i,j,k分别对应1,2,3;

接下来考虑转移,我们这里去考虑贡献更为方便,对于某i长度的个序列,其’(‘比')'多j个,其后缀可能完全匹配子串S,也可能完全不匹配,我们基于此考虑在其末尾加上'('或')'两种情况,假设已经匹配了k长度:

  1.  那么如果我们再往后添加一个'(':
  • 如果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数组,手撕几个例子就懂是什么了,其
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值