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$的一个子串 还以为是什么纯粹的数学构造题,一通 ...
随机推荐
- hibernate(一) 第一个hibernate工程
序言 其实hibernate已经学过一遍,不过因为太糊弄,急于求成,导致现在需要重新来学习,通过亲自去敲每一行代码,来去理解每一个知识点. ---WH 一.什么是Hibernate? 轻量级JavaE ...
- Shiro入门 - 通过自定义Realm连数数据库进行认证
添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...
- DedeCMS找后台目录漏洞
参考文章 https://xianzhi.aliyun.com/forum/topic/2064 近期,学习的先知社区<解决DEDECMS历史难题--找后台目录>的内容,记录一下. 利用限 ...
- Django学习手册 - 如何安装django 和 python ?
整体步骤阐述:(windows环境下) 步骤一,下载python安装包 (和 jiango 压缩包) 步骤二,安装python 配置python的环境变量 步骤三,安装djang 方式一:pip in ...
- UVA1194 Machine Schedule
题目地址:UVA1194 Machine Schedule 二分图最小覆盖模型的要素 每条边有两个端点,二者至少选择一个.简称 \(2\) 要素. \(2\) 要素在本题中的体现 每个任务要么在 \( ...
- python 字典不区分大小写工具类
# -*- coding: utf-8 -*- # @Time : 2018/12/20 4:28 PM # @Author : cxa # @File : DictHelper.py # @Soft ...
- leetcode327 Count of Range Sum
问题描述: 给定一个整数数组nums,返回其所有落在[low, upper]范围内(包含边界)的区间和的数目. 区间和sums(i, j)的定义为所有下标为i到j之间(i ≤ j)的元素的和,包含边界 ...
- python3+selenium入门16-窗口截图
有时候需要把一些浏览器当前窗口截图下来,比如操作抱错的时候.WebDriver类下.get_screenshot_as_file()方法可窗口截图,需要传入一个截图文件名的路径.window要用\\当 ...
- SIOCGMIIPHY 和 SIOCSMIIREG 命令
使用ioctl命令时,可以看到上述两个命令的存在, 在头文件 include/linux/sockios.h,定义如下: #define SIOCETHTOOL 0x8946 /* ...
- 修改JDK版本配置
我使用的maven是3.0.5版本的,在创建项目的时候,默认使用的jdk为1.5版本 在项目的pom.xml中添加如下配置可修改使用的jdk版本. <properties> <!-- ...