CF1015F
玄学字符串dp...
题意:给定一个括号序列,求长度为2n的合法的括号序列的个数(要求每个被统计的合法序列中均至少有一个子串为给定的括号序列)
题解:
这题没有想的那么复杂,就是暴力的一个dp
首先我们设状态f[i][j][k][0/1]表示当前放到了第i个括号,前i个括号中左右括号个数差为j,已经放好的括号中长为k的部分能与s相匹配,0/1表示之前是否存在与s能匹配上的一整个子串
那么我们考虑转移:
首先我们可以枚举第i位放左括号还是右括号,如果放左括号,左右括号差值+1,否则差值-1,这些都好办,问题在于后两维!
那么显然我们要枚举原来与s匹配了多少,接下来在新放上一个括号之后,我们要考虑加上一个括号之后这一新的后缀能匹配s多长,那这一点可以kmp预处理或者暴力预处理,这里我选择暴力预处理。
于是我们只需要借助上面处理出的辅助数组进行转移即可
最后统计所有可行答案。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define mode 1000000007
#define ll long long
using namespace std;
ll f[][][][];
ll len[][];
char s[];
char p[];
int n;
int solve(int ilen)
{
for(int i=ilen;i>;i--)//??????
{
bool flag=;
for(int j=;j<i;j++)
{
if(p[ilen-i+j]!=s[j])
{
flag=;
break;
}
}
if(!flag)
{
return i;
}
}
return ;
}
int main()
{
scanf("%d",&n);
scanf("%s",s);
int l=strlen(s);
if(s[]=='(')
{
len[][]=;
}else
{
len[][]=;
}
for(int i=;i<l;i++)
{
p[i]=s[i];
p[i+]='(';
len[i+][]=solve(i+);
p[i+]=')';
len[i+][]=solve(i+);
}
f[][][][]=;
for(int i=;i<=*n;i++)//???????λ
{
for(int j=;j<=n;j++)//??????????????
{
for(int k=;k<=l;k++)//??????????????
{
for(int t=;t<=;t++)
{
if(!f[i-][j][k][t])
{
continue;
}
if(j+<=n)
{
f[i][j+][len[k][]][t|(len[k][]==l)]+=f[i-][j][k][t];
f[i][j+][len[k][]][t|(len[k][]==l)]%=mode;
}
if(j>)
{
f[i][j-][len[k][]][t|(len[k][]==l)]+=f[i-][j][k][t];
f[i][j-][len[k][]][t|(len[k][]==l)]%=mode;
}
}
}
}
}
ll ans=;
for(int i=;i<=l;i++)
{
ans+=f[*n][][i][];
ans%=mode;
}
printf("%lld\n",ans);
return ;
}
CF1015F的更多相关文章
- 【CF1015F】Bracket Substring(字符串DP)
题意:给定一个只由左右括号组成的字符串s,问长度为2*n的包含它的合法括号序列方案数,答案对1e9+7取模 1≤n≤100,1≤|s|≤200 思路:暴力预处理出s的每个前缀[0..i]后加左右括号分 ...
- CF1015F Bracket Substring (KMP+DP)
题目大意:给你一个长度为$n$的括号序列$T$,要求你构造一个长度为$2n$的括号序列$S$,保证这个括号序列在插入数字后一定是正确的,并且$T$是$S$的一个子串 还以为是什么纯粹的数学构造题,一通 ...
随机推荐
- Java开发环境配置(1)--tool准备
工具准备:1.eclipse-mars开发工具必须安装 2.XAMPP-环境集成了MYSQL,APACHE,TOMCAT建议安装 3.TOMCAT提供了二个版本(8.0和9.0),建议安装一个以备不时 ...
- bootstrap-table前端修改后台传来的数据重新进行渲染
使用bootstrap-table显示数据,后台传回数据以后,可能需要对其做调整,如需要前端为数据添加单位 回到顶部 调整数据代码 $("#"+tableId).bootstrap ...
- linux系统 之 curl命令
1,curl命令 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工 ...
- truncate、delete、drop区别
语法: truncate table 表名 delete from 表名 drop table 表名 应用范围: truncate 只能对表,且不能用于参与了索引的表,不能用于外键约束引用的表 del ...
- pythonのsqlalchemy简单查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
- Vue获取事件源
设置事件源 <label :data-weight="item1.EvaluateWeight" @click='radioClick' :data-id="ite ...
- LaTeX Error: Something's wrong--perhaps a missing \item
使用Latex 引用参考文献,.bib文件是个很好的助手,创建后 1.第一步点击Latex编译,可以获得*.aux文件.*.dvi文件.*.log文件以及*.gz文件: 2.第二步点击Bibtex编译 ...
- requests库入门05-参数类型
一个接口基本都需要传入参数,有的参数必填,有的不必填. params参数 使用params参数来传递接口所需要的参数.一般用在get请求中,url参数是通过?拼接,?前面是接口的地址,之后是请求的参数 ...
- Redis学习之一 安装
一.简介 定义 Remote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C ...