• 题意:[CF 1015F](https://codeforces.com/contest/1015/problem/F)

    给你一个模式串A(一个不一定合法的括号序列),让你构造长度为2*n的合法括号序列,问有多少种方案使得含A为其子串。(n<=100)
  • 思路:

    KMP+DP

    \(dp[i][j][k][0/1]\)表示当前匹配到了\(a[i]\),\(s[j]\),此时左括号数-右括号数为\(k\),是否含有A的方案数。

    然后j->j+1,枚举j+1是'('还是')',然后将其按照KMP匹配a。方程见代码。
  • code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=205;
const ll mod=1e9+7;
char s[N];
ll dp[N][N][N][2];
int n,len,a[N],nxt[N],to[N][3];
void init() {
int j=0;
for(int i=2;i<=len;i++) {
while(j&&a[i]!=a[j+1])j=nxt[j];
if(a[i]==a[j+1])j++;
nxt[i]=j;
}
}
int Fld(int i,int c) {
if(to[i][c+1]!=-1)return to[i][c+1];
while(i&&a[i+1]!=c)i=nxt[i];
return to[i][c+1]=i+(a[i+1]==c);
} int main() {
memset(to,-1,sizeof(to));
scanf("%d",&n);
scanf("%s",s+1);len=strlen(s+1);
for(int i=1;i<=len;i++)a[i]=(s[i]=='(')?1:-1;
init();
dp[0][0][0][0]=1;
for(int j=0;j<(n<<1);j++) {
for(int i=0;i<=len;i++) {
for(int k=0;k<=n;k++) {
for(int f=0;f<=1;f++) {
if(!dp[i][j][k][f])continue; //优化
if(k) {int t=Fld(i,-1);dp[t][j+1][k-1][f|(t==len)]=(dp[t][j+1][k-1][f|(t==len)]+dp[i][j][k][f])%mod;}
if(k<n) {int t=Fld(i,1);dp[t][j+1][k+1][f|(t==len)]=(dp[t][j+1][k+1][f|(t==len)]+dp[i][j][k][f])%mod;}
}
}
}
}
ll ans=0;
for(int i=0;i<=len;i++) ans=(ans+dp[i][n<<1][0][1])%mod;
printf("%lld",ans);
return 0;
}
//5
//()))()

ps.大常数选手的一些不超时小优化

1.(必须加):if(!dp[i][j][k][f])continue;因为有很多不可能的状态,大量优化时间。

2.记忆化Fld

效果从下到上分别为:1+2,0,1

CF 1015F的更多相关文章

  1. [cf 1015f] Bracket Substring (dp+kmp)

    传送门 Solution 设dp方程dp[now][pos][red][fla]表示还有now个位置,pos表示匹配到第几位,red表示左括号数-右括号数,fla表示是否已经是给定串的字串 暴力转移即 ...

  2. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  3. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  4. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  5. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  6. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  8. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  9. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

随机推荐

  1. 如何使用Flannel搭建跨主机互联的容器网络

    当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因. 跨主机容器互联 下图描述了一个简单的集群网络,在该集群内,有两 ...

  2. token的工作原理及其功能

    一.前言 登录模块是我们在前端项目中一定会有的模块,模块中有一个重要的部分是用户登录验证,对于验证用户是否登录过,我们直接处理办法是检查缓存中是否存在token值,若存在则用户可直接登录,反之,用户需 ...

  3. Python窗口学习之给按钮美化

    tkinter的按钮很丑也很难改 怎么办呢? 最好的方法就是不用按钮! 给Label添加点击事件,和按钮的作用是一样的! 代码: #!/usr/bin/env python # -*- coding: ...

  4. java中StringTokenizer的用法

    4.StringTokenizer StringTokenizer可以解析分隔符不是空格的情况.例子:import java.util.StringTokenizer;public class Tes ...

  5. git总是需要输入用户名密码问题解决

    解决办法: git bash进入你的项目目录,输入: git config --global credential.helper store 然后你会在你本地生成一个文本,上边记录你的账号和密码.当然 ...

  6. Java在方法中定义可变参数类型

    学习目标: 掌握可变参数的应用 学习内容: 1.定义 在方法中传递数组有一种更简单的方式--方法的可变参数,其本质是一个语法糖,目的是让开发者写代码更简单. 2.语法 [修饰符] 返回值类型 方法名称 ...

  7. node安装和环境配置

    参考链接: https://www.cnblogs.com/zwjphp/p/14123746.html 一.安装环境 1.本机:Windows 10 (64位) 2.Node.js:v12.13.0 ...

  8. Linux---远程连接、命令行基础、文件及目录管理

    远程连接管理Linux实践(centos) 连接小知识 IP地址:访问连接服务器,需要通过服务器的IP地址来实现,服务器的IP地址就相当于服务器的具体地址.一计算机都会有一个唯一的32位的IP地址,8 ...

  9. 帝国cms 列表页或文章页取当前栏目链接

    获取当前栏目链接 : <?=sys_ReturnBqClassUrl($class_r[$GLOBALS[navclassid]]);?>获取当前栏目名称 :[!--class.name- ...

  10. 几个i的幂的累加公式1^2+2^2+3^2 2~5

    1^2+2^2+3^2+--+n^2=n(n+1)(2n+1)/6 1^3+2^3+3^3+...+n^3=(1+2+3+...+n)^2 =[n(n+1)/2]^2 1^4+2^4+3^4+--+n ...