C. Longest Regular Bracket Sequence
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

This is yet another problem dealing with regular bracket sequences.

We should remind you that a bracket sequence is called regular, if by inserting «+» and «1» into it we can get a correct mathematical expression. For example, sequences «(())()», «()» and «(()(()))» are regular, while «)(», «(()» and «(()))(» are not.

You are given a string of «(» and «)» characters. You are to find its longest substring that is a regular bracket sequence. You are to find the number of such substrings as well.

Input

The first line of the input file contains a non-empty string, consisting of «(» and «)» characters. Its length does not exceed 106.

Output

Print the length of the longest substring that is a regular bracket sequence, and the number of such substrings. If there are no such substrings, write the only line containing "0 1".

Examples
Input
)((())))(()())
Output
6 2
Input
))(
Output
0 1

(吐槽:这题真是道好题呀。。想贪心贪心不出来,想dp,转移方程不知从何推起。。。

题意:给一个字符串,有左括号和右括号。求满足括号配对的最长子串的长度及个数。

解题思路1:求dp转移方程。遇到左括号就记录下来,遇到右括号,就把与之最近的左括号取出来(如果有的话)与右括号配对,此时这段的长度是右括号位置与左括号位置之差,记为dp[t]。
此时的这个长度,再加上一个相邻串的长度即dp[t-1]的长度,就是目前这个串的长度啦,所以转移方程就是dp[t]=dp[t-1]+i-t+1;
附ac代码:
 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <stack>
6 using namespace std;
7 const int maxn = 1e6+5;
8 int dp[maxn];
9 stack<int>q;
10 int main() {
11 ios::sync_with_stdio(false);
12 cin.tie(0);cout.tie(0);
13 string s;
14 int cnt=1,maxx=0;
15 cin>>s;
16 for(int i=0;i<s.size();++i) {
17 if(s[i]=='(') {
18 q.push(i);
19 }
20 else if(!q.empty()) {
21 int u=q.top();
22 q.pop();
23 dp[i]=dp[u-1]+i-u+1;
24 if(dp[i]>maxx) {
25 maxx=dp[i];
26 cnt=1;
27 }
28 else if(dp[i]==maxx) {
29 cnt++;
30 }
31 }
32 }
33 if(maxx==0) cout<<0<<" "<<1;
34 else cout<<maxx<<" "<<cnt;
35 return 0;
36 }

解题思路2:先找出能够括号匹配的子串,然后判断哪个最长。具体做法是分别从前向后和从后向前遍历一遍,比如从前向后遍历的时候,遇到一个右括号且左括号不为0的时候,说明这个右括号是肯定可以括号匹配的,记录下来dp[i]=1,反向遍历也是同样操作。

然后for循环遍历记录数组,看dp[i]是否为1,找出最长的及其个数,代码比文字更好理解。

附ac代码:

 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <stack>
6 using namespace std;
7 const int maxn = 1e6+5;
8 int dp[maxn];
9 stack<int>q;
10 int main() {
11 ios::sync_with_stdio(false);
12 cin.tie(0);cout.tie(0);
13 string s;
14 int cnt=0,maxx=0,ans=0;
15 cin>>s;
16 for(int i=0;i<s.size();++i) {
17 if(s[i]=='(') {
18 ++cnt;
19 }
20 else if(cnt>0) {
21 dp[i]=1;
22 --cnt;
23 }
24 }
25 cnt=0;
26 for(int i=s.size()-1;i>=0;--i) {
27 if(s[i]==')') {
28 ++cnt;
29 }
30 else if(cnt>0) {
31 dp[i]=1;
32 --cnt;
33 }
34 }
35 cnt=1;ans=1;
36 for(int i=0;i<s.size();++i) {
37 if(dp[i]&&dp[i+1]) {
38 ++cnt;
39 }
40 else cnt=1;
41 if(cnt>maxx) {
42 maxx=cnt;
43 ans=0;
44 }
45 if(cnt==maxx) {
46 ++ans;
47 }
48 }
49 if(maxx==1) cout<<0<<" "<<1;
50 else cout<<maxx<<" "<<ans;
51 return 0;
52 }

codeforces 5C的更多相关文章

  1. (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)

    (CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...

  2. Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)

    题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次 ...

  3. CodeForces 5C Longest Regular Backet sequence

    This is yet another problem dealing with regular bracket sequences. We should remind you that a brac ...

  4. CodeForces - 5C(思维+括号匹配)

    题意 https://vjudge.net/problem/CodeForces-5C 给出一个括号序列,求出最长合法子串和它的数量. 合法的定义:这个序列中左右括号匹配. 思路 这个题和普通的括号匹 ...

  5. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  6. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  7. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  8. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  9. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

随机推荐

  1. 源代码增强的一点说明(souce code enhance )

    souce code enhance 分为显式和隐式两种. 下面以显式创建为例子: 1.在ABAP编辑器中, 打开想要编辑的程序,切换到可编辑模式 2.在源代码中的指定位置右键,弹出菜单,选择 Enh ...

  2. 图像分类学习:X光胸片诊断识别----迁移学习

    引言   刚进入人工智能实验室,不知道是在学习机器学习还是深度学习,想来他俩可能是一个东西,查阅之后才知道这是两个领域,或许也有些交叉,毕竟我也刚接触,不甚了解.   在我还是个纯度小白之时,写下这篇 ...

  3. Linux更换软件源

    1. Ubuntu16.04 sudo cp /etc/apt/sources.list /etc/apt/sources_origin.list # 备份 sudo gedit /etc/apt/s ...

  4. echarts图表X轴文字过长解决解决方案:根据文字长度自动旋转

    Echarts 标签中文本内容太长的时候怎么办 ? 关于这个问题搜索一下,有很多解决方案.无非就是 省略(间隔显示).旋转文字方向.竖排展示 前面两种解决方案,就是echarts暴露的: {   ax ...

  5. Linux服务器内存池技术是如何实现的

    Linux服务器内存池技术是如何实现的

  6. 服务之间的调用为啥不直接用 HTTP 而用 RPC?

    什么是 RPC?RPC原理是什么? 什么是 RPC? RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比 ...

  7. qbxt 学习笔记 10.2

    写在前面 昨晚网络咕了,而且比较晚,没交作业.解题报告写成书面的了,代码另发 + 博客. 目录 写在前面 1. 爬山算法 概述 示例 2. 模拟退火 概述 3. Meet in the Middle ...

  8. 用RabbitMQ了好几年之后,我总结出来5点RabbitMQ的使用心得

    大概从 2013 年开始,我就开始了自己和 RabbitMQ 的接触,到现在已经有七年多了. 在这七年中,既有一些对 RabbitMQ 的深度体验,更有无数的血泪史. 而根据我这么多年的使用经验,我将 ...

  9. TCP/IP__TCP协议IP协议&IP地址

    IP协议(Internet Protocol) 1.   定位:计算机网络间相互连接进行通信而定义的协议.在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进 ...

  10. docker学习一

    由于本人学习精力有限,不能像大学时那样,每个笔记都认真的手敲记录,一些地方会截图展示,并会添加自己的理解和备注,建议大家也做自己的笔记,看别人的可以,但是自己动手并思考记忆更深刻. 1.什么是虚拟化 ...