【23.24%】【codeforces 629C】Famil Door and Brackets
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
As Famil Door’s birthday is coming, some of his friends (like Gabi) decided to buy a present for him. His friends are going to buy a string consisted of round brackets since Famil Door loves string of brackets of length n more than any other strings!
The sequence of round brackets is called valid if and only if:
the total number of opening brackets is equal to the total number of closing brackets;
for any prefix of the sequence, the number of opening brackets is greater or equal than the number of closing brackets.
Gabi bought a string s of length m (m ≤ n) and want to complete it to obtain a valid sequence of brackets of length n. He is going to pick some strings p and q consisting of round brackets and merge them in a string p + s + q, that is add the string p at the beginning of the string s and string q at the end of the string s.
Now he wonders, how many pairs of strings p and q exists, such that the string p + s + q is a valid sequence of round brackets. As this number may be pretty large, he wants to calculate it modulo 109 + 7.
Input
First line contains n and m (1 ≤ m ≤ n ≤ 100 000, n - m ≤ 2000) — the desired length of the string and the length of the string bought by Gabi, respectively.
The second line contains string s of length m consisting of characters ‘(’ and ‘)’ only.
Output
Print the number of pairs of string p and q such that p + s + q is a valid sequence of round brackets modulo 109 + 7.
Examples
input
4 1
(
output
4
input
4 4
(())
output
1
input
4 3
(((
output
0
Note
In the first sample there are four different valid pairs:
p = “(“, q = “))”
p = “()”, q = “)”
p = “”, q = “())”
p = “”, q = “)()”
In the second sample the only way to obtain a desired string is choose empty p and q.
In the third sample there is no way to get a valid sequence of brackets.
【题解】
给你一个串;
只包含圆括号;
可以让你在最左边和最右边加上两个串p和q;
这两个串也只能包括括号;
要使得最后的括号是匹配的;
问你有多少对P和q,p和q可以为空
每时每刻左括号的数目都要大于等于右括号的数目;
最后那个限制起了很大的作用;
把左括号看做1,右括号看做-1;
则它的要求是每时每刻前缀和都大于0;
则先求出所给的s的前缀和,并记录前缀和的最小值mi;
预处理出dp[i][j]表示i个括号能够造出前缀和为j的方案数(满足每时每刻前缀和都大于等于0的方案);
然后枚举q的长度i,前缀和为j
如果dp[i][j]+mi>=0;
则从左到中间那个串都是满足题意的了(前缀和始终大于等于0)
然后再获取P;
p的长度就是n-m-i;
它的前缀和该是啥?j+pres;
这里的j+pres指的是负数->加上dp[n-m-i][j+pres];
可以理解为从右到左进行DP;然后从右到左的过程中每时每刻右括号的数目都大于左括号的数目;(等价转化);
这样可以保证从最左边的q到最右边的p的过程中间都不会出现前缀和小于0的情况;
假设在p处出现了前缀和小于0;则在这个位置的右边右括号的数目大于左括号的数目;最后结果就不可能为0;只可能是负数;
这和j+pres-(j+pres)==0不符合;
所以在这个串中不会出现前缀和为负数的情况;
具体实现看代码;
(那个DP很简单的。。);
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define LL long long
using namespace std;
const int MAXN = 2000;
const LL MOD = 1e9+7;
int n,m;
LL dp[MAXN+20][MAXN+20];
string s;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
void input_LL(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void input_int(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_int(n);input_int(m);
cin >> s;
int pres = 0,mi=0;
for (int i = 0;i<=m-1;i++)
{
if (s[i]=='(')
pres++;
else
pres--;
mi = min(mi,pres);
}
dp[0][0] = 1;
for (int i = 1;i <= 2000;i++)
for (int j = 0;j <= i;j++)
{
if (j)
dp[i][j]=(dp[i][j]+dp[i-1][j-1])%MOD;//add "("
dp[i][j] = (dp[i][j]+dp[i-1][j+1]) % MOD;//add ")"
}
LL ans = 0;
for (int p = 0;p <= n-m;p++)
for (int j = 0;j <= p;j++)
if (mi+j>=0 && j+pres<=(n-m))
ans = (ans + dp[p][j]*dp[n-m-p][pres+j])%MOD;
cout << ans << endl;
return 0;
}
【23.24%】【codeforces 629C】Famil Door and Brackets的更多相关文章
- JAVA 基础编程练习题24 【程序 24 根据输入求输出】
24 [程序 24 根据输入求输出] 题目:给一个不多于 5 位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. package cskaoyan; public class cskaoya ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【23. 合并K个排序链表】【困难】【优先队列/堆排序】
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6] 输出: 1->1-> ...
- 【20.23%】【codeforces 740A】Alyona and copybooks
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【23.33%】【codeforces 557B】Pasha and Tea
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【23.39%】【codeforces 558C】Amr and Chemistry
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【24.17%】【codeforces 721D】Maxim and Array
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【24.67%】【codeforces 551C】 GukiZ hates Boxes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【24.34%】【codeforces 560D】Equivalent Strings
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- js中#代表什么
js中#代表什么 一.总结 1.#号:代表id选择器 2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...
- Altium Designer 在pcb下导入的原件引脚是绿的
当然也可能是其他规则原因导致的
- var let 区别
var a = 5; var b = 10; if (a === 5) { let a = 4; // if 块级作用域 var b = 1; // 函数级作用域 console.log(a); // ...
- Mybatis的使用中的一些不太注意的技巧
以下就总结一下Mybatis的使用中的一些不太注意的技巧,算是Mybatis的总结笔 1.插入时主键返回 我们向数据库插入一条记录是,使用Mybatis的<insert>是无法返回插入的主 ...
- Spring Boot中的缓存支持(一)注解配置与EhCache使用
Spring Boot中的缓存支持(一)注解配置与EhCache使用 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决 ...
- 判断是iphone或是ipad 和 系统版本
//判断是iphone或是ipad等 NSLog(@"Device -- %@",[UIDevice currentDevice].model); //系统版本 NSLog(@&q ...
- sqoop 1.4.4-cdh5.1.2快速入门 分类: C_OHTERS 2015-06-06 11:40 208人阅读 评论(0) 收藏
一.快速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...
- iOS将汉字转换为拼音
将汉字转换为拼音 - (NSString *)chineseToPinyin:(NSString *)chinese withSpace:(BOOL)withSpace { CFStringRef h ...
- 解决gvim 8.1中zip插件打开zip文件内容时,而文件路径带有空格的问题。
解决gvim 8.1中zip插件打开zip文件内容时,而文件路径带有空格的问题. 现象是只能打开一次,第二次打开就显示为空了. 通过 lcd切换工作目录.使得命令行操作中不再有带空格的路径 vim81 ...
- [Vue] Build Vue.js Apps with the Vue-CLI and Nuxt.js
The vue-cli allows you to easily start up Vue projects from the command line while Nuxt.js enables a ...