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$的一个子串 还以为是什么纯粹的数学构造题,一通 ...
随机推荐
- 人人开源分模块,非原生html报错,很难查找问题所在,有vue语法
<!DOCTYPE html> <html> <head> <title>学生表</title> #parse("sys/head ...
- Python笔记 【无序】 【三】
#打开文件 os.open(file, flags[, mode]); file -- 要打开的文件 flags -- 该参数可以是以下选项,多个使用 "|" 隔开: os.O_R ...
- 从url(地址栏)获取参数:Jquery中getUrlParam()方法的使用
我想要获取如下id 如下代码(传参要加问好!!) function getUrlParam(id) { var regExp = new RegExp('([?]|&)' + id+ '=([ ...
- python3+selenium入门06-浏览器操作
WebDriver主要提供元素操作的方法,但也提供了一些关于浏览器操作的方法,比如设置浏览器大小,浏览器前进,后退,刷新等 设置浏览器大小 有时候需要设置浏览器大小,比如访问收集网页,设置浏览器大小跟 ...
- Tickets HDU - 1260 水DP
HDU - 1260 现在有n个人要买电影票,如果知道每个人单独买票花费的时间, 还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票. 直接dp就行,注意下输出和初始化 每次从dp[i-1 ...
- 数字证书及CA的扫盲介绍
★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥.晦涩.俺先拿一个通俗的例子来说事儿. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 ...
- Fiddler模拟低速网络
1. 打开 Rules -> Customize Rules,ctrl + F 找 300 2.修改上传.下载速度,保存 ctrl + s 3.启动模拟网络限速 4.想要取消模拟网络限速,取消勾 ...
- servlet生成图片验证码
package cn.itcast.servlet.session.demo3; import java.awt.Color; import java.awt.Font; import java.aw ...
- laravel sql复杂语句,原生写法----连表分组
### 使用了临时表.又分组又连表的感觉好难写,使用拉 ravel 但是现在越来也相信,没解决一个新的难题,自己又进步了一点点 ### 原生的sql: select user_code, realna ...
- 【原创】运维基础之OpenResty(Nginx+Lua)+Kafka
使用docker部署 1 下载 # wget https://github.com/doujiang24/lua-resty-kafka/archive/v0.06.tar.gz# tar xvf v ...