题目大意:给你一个长度为$n$的括号序列$T$,要求你构造一个长度为$2n$的括号序列$S$,保证这个括号序列在插入数字后一定是正确的,并且$T$是$S$的一个子串

还以为是什么纯粹的数学构造题,一通乱搞无果。好吧,并没有想到$KMP$....

题解:首先用$KMP$预处理出数组$to[i][0/1]$,表示在$i+1$位填上括号$'('$和$')'$后匹配到字符串T的位置

定义$f[i][j][k][0/1]$表示已经添加了$i$个括号,左右括号数量之差是$j$,已经匹配到了字符串$T$的第$k$位,是否包含$T$串

再用$DP$转移即可,实现很简单

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 205
#define maxn 250
#define uint unsigned int
#define ll long long
#define mod 1000000007
using namespace std; int n,len;
char str[N];
uint f[N][N][N][];
int nxt[N],to[N][];
void get_nxt()
{
int i=,j=;nxt[]=;
while(i<=len){
if(j==||str[i]==str[j]){
i++,j++;nxt[i]=j;
}else{j=nxt[j];}
}
for(int i=,k;i<len;i++)
{
k=i;
if(str[i+]=='('){
to[i][]=k+;k=k+;
for(;str[k]!=')'&&k;k=nxt[k]);
to[i][]=k;
}else{
to[i][]=k+;k=k+;
for(;str[k]!='('&&k;k=nxt[k]);
to[i][]=k;
}
}
} int main()
{
scanf("%d",&n);
scanf("%s",str+);
len=strlen(str+);
get_nxt();
f[][][][]=;
for(int i=;i<*n;i++)
{
for(int j=;j<=n;j++){
for(int k=;k<len;k++)
{
if(j<n)(f[i+][j+][to[k][]][to[k][]==len]+=f[i][j][k][])%=mod; //'('
if(j>)(f[i+][j-][to[k][]][to[k][]==len]+=f[i][j][k][])%=mod; //')'
}
if(j<n)(f[i+][j+][len][]+=f[i][j][len][])%=mod;
if(j>)(f[i+][j-][len][]+=f[i][j][len][])%=mod;
}
}
int num=;
printf("%u\n",f[*n][][len][]);
return ;
}

CF1015F Bracket Substring (KMP+DP)的更多相关文章

  1. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  2. codeforces432D Prefixes and Suffixes(kmp+dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a strin ...

  3. [kmp+dp] hdu 4628 Pieces

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...

  4. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  5. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  6. POJ 3336 Count the string (KMP+DP,好题)

    参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...

  7. 【KMP+DP】Count the string

    KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that A ...

  8. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  9. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

随机推荐

  1. vue 移动端项目,动态控制div距离底部的距离

    <template> <div class="details"> <com-nav-bar title="保险详情"> &l ...

  2. UVALive-8078 Bracket Sequence 简单dp

    题目链接:https://cn.vjudge.net/problem/UVALive-8078 题意 括号序列T是这样定义的: T是个空的 T是(T), {T}, 或者 [T] T是两个T组成的,比如 ...

  3. BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)

    题目大意:略 一定范围内求最大值,考虑二分答案 设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $ 展开可得,$ ...

  4. JQuery获取ID含有特殊字符的DOM元素

    因为业务需要,DOM元素的ID被命名为"13/16(FCO26)",执行JQuery的DOM查询时,提示如下错误 Uncaught Error: Syntax error, unr ...

  5. elastic学习笔记

    要点 不同工具之间版本匹配很重要由点及面,先实践起来再学细节的原理和使用 技术栈 laravel5.5框架+scout组件+elasticsearch6.3.0搜索引擎 辅助 elasticsearc ...

  6. python学习笔记:第三天

    day03: 1.python中所有的变量都可以改变 2.Print(name)   打印 3.Del name  删除 4.python中python2与python3不能兼容,需要分别安装pyth ...

  7. 通过wget下载tomcat

    wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.42/bin/apache-tomcat-8.0.42.tar.gz 注意:下载之前确 ...

  8. vue自定义一个过滤器

    vue如何自定义一个过滤器 html代码: <div id="app"> <input type="text" v-model="m ...

  9. navicat连接SQL Sever数据库出现的问题

    1.navicat 连接sqlserver提示要安装 sql server native client 解决办法:在navicat安装目录下有个sqlncli_x64.msi文件,双击安装一直下一步就 ...

  10. Spring Security中的MD5盐值加密

    在 spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字 ...